MsBuild最小プロジェクト

おそらく、MsBuildプロジェクトの構築システムに精通しているすべてのプログラマーは、既存の構築プロセスを拡張するのではなく、最初から構築するという考えを持っていました。 つまり、既存のタイプのプロジェクト.csproj(C#プロジェクト)および.vbproj(VB.NETプロジェクト)に別のタイプを追加します(たとえば、.myprojまたは単に.proj)。 そして、誰か、このアイデアを実装しようとしたかもしれません。



このトピックには情報が豊富に含まれているように思えますが、MSDNにはステップバイステップガイドさえあります。 しかし、そのようなマニュアルのプロジェクトファイルを作成した後、私たちは残酷にだまされたことが明らかになりました。



この記事では、このトピックに関する私自身の研究を紹介します。



問題の声明



Visual Studio 2008プロジェクトの理解において「通常」に課される最小要件を決定するには、次のプロジェクトを作成します。



決定プロセス



この問題を解決するプロセスは非常に複雑であるため、この記事の範囲を超えています。 次のツールが決定プロセスで使用されたとしか言えません。

  1. MSDNのMsBuildリファレンス
  2. テキストエディター;
  3. ファイル%windir%\ Microsoft.NET \ Framework \ v3.5 \ Microsoft.Common.targetsの内容。
  4. オプション/ v:dおよび/ v:msbuild.exeプログラムの診断;
  5. cygwinバンドルのgrep.exeプログラム。


解決策



次のプロジェクトファイルはすべての要件を満たしています(さらに拡張するのに適しています)。

<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <ProjectGuid>{F4279D30-8B96-4217-B811-D2912FAD2C71}</ProjectGuid> </PropertyGroup> <ItemGroup> <BuiltProjectOutputGroupKeyOutput Include="SuperLibrary.dll" /> </ItemGroup> <ItemGroup> <Content Include="logo.bmp" /> <Content Include="help.html" /> </ItemGroup> <Target Name="Build" Outputs="" /> <Target Name="Rebuild" /> <Target Name="Clean" /> <Target Name="GetTargetPath" Outputs="" /> <Target Name="GetNativeManifest" Outputs="" /> <Target Name="GetCopyToOutputDirectoryItems" Outputs="@(_Content)"> <ItemGroup> <Content Include="@(BuiltProjectOutputGroupKeyOutput)" /> <_Content Include="@(Content->'%(FullPath)')"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <TargetPath>%(Filename)%(Extension)</TargetPath> </_Content> </ItemGroup> </Target> </Project>
      
      







結論



上記のプロジェクトファイルで作業する過程で、Visual Studio 2008によってすべてのプロジェクトファイルに課せられる次の要件が見つかりました。

  1. プロジェクトファイルには、MsBuildを使用する言語に関連付けられている拡張子、つまり.csprojまたは.vbprojが必要ですが、.myprojは一切必要ありません。
  2. ProjectGuidプロパティがプロジェクトファイルに存在する必要があります。
  3. プロジェクトには、拡張子が.dllまたは.exeの要素BuiltProjectOutputGroupKeyOutputが必要です(この要素はインポートできます)。
  4. プロジェクトファイルで指定されたすべての要素(ただし、他のファイルからインポートされていない!)はソリューションエクスプローラーに表示され、ディスク上に存在する必要があります(他のファイルからインポートされた要素はGUIに表示されません);
  5. プロジェクトには、Build、Rebuild、およびCleanの目標と、GetTargetPath、GetNativeManifest、およびGetCopyToOutputDirectoryItem関数の目標が必要です。
  6. BuildターゲットとGetTargetPathターゲットは、プロジェクトのプライマリ出力ファイルの出力を示す必要があります(ただし、プライマリファイルがない場合は何も返さない場合があります)。
  7. GetNativeManifestの目標は、プロジェクトにこのマニフェストがあるときにプロジェクトのマニフェストを返すことです。
  8. GetCopyToOutputDirectoryItemsの目標は、プロジェクトの出力ファイルのリストを返すことです。
  9. 関数ターゲット(ビルドを含む)から返されるすべての要素に対して、完全なパスのみを使用する必要があります(これらの要素はプロジェクト間で転送されるため)。
  10. GetCopyToOutputDirectoryItemsターゲットによって返されるすべての要素は、CopyToOutputDirectoryメタデータがAlwaysまたはPreserveNewestに設定されている必要があります。
  11. GetCopyToOutputDirectoryItemsターゲットによって返されるすべての要素について、TargetPathメタデータを指定する必要があります。これは、別のプロジェクトの出力ディレクトリにコピーするときのファイル名に関連することを意味します(適切なデフォルトは、%(Filename)%(Extension)、つまりソース要素の名前と拡張子です)。




これらの要件を満たすプロジェクトは、Visual Studio 2008で開くことができ、他のプロジェクトに追加できるほか、別のプロジェクトの依存関係リストにも追加できることを確認します。



All Articles