継承されたプロパティ シートを使用して、既存の C++ コードのアウトオブプレース ビルド システムのセットアップを完了しました。これは、Visual C++ 製品に固有の機能と思われます。場違いなビルドでは、多くのプロジェクト設定を変更する必要があり、継承されたプロパティ シートにより、プロジェクトにプロパティ シートを添付するだけで必要な設定をすべて変更できました。チームを UI 用の C++/MFC から C# および WPF に移行していますが、同じ場違いなビルド機能を提供する必要があり、うまくいけば同じ利便性があります。C# プロジェクトでこれを行う方法が見つからないようです。最初に MsBuild ターゲット ファイルを参照できるかどうかを確認しましたが、これを行う方法が見つかりませんでした。全体に MsBuild を使用できることはわかっていますが、それは必要以上に複雑に思えます。
3 に答える
「アウトオブプレース」ビルドシステムとは何かはよくわかりませんが、コンパイルされたファイル(または他のリソース)を他のディレクトリにコピーする機能が必要な場合は、MSBuildビルドターゲットに接続することでコピーできます。 。
私たちのプロジェクトでは、コンパイルされたdllをlibフォルダーに移動し、ビルドの完了後にファイルを適切な場所に配置します。Target
これを行うために、 's、Property
' s、および'sを作成するカスタムビルド.targetファイルを作成しました。これをItemGroup
使用して、外部出力フォルダーにデータを入力します。
カスタムターゲットファイルは次のようになります。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectName>TheProject</ProjectName>
<ProjectDepthPath>..\..\</ProjectDepthPath>
<ProjectsLibFolder>..\..\lib\</ProjectsLibFolder>
<LibFolder>$(ProjectsLibFolder)$(ProjectName)\$(Configuration)\</LibFolder>
</PropertyGroup>
<Target Name="DeleteLibFiles">
<Delete Files="@(LibFiles-> '$(ProjectDepthPath)$(LibFolder)%(filename)%(extension)')" TreatErrorsAsWarnings="true" />
</Target>
<Target Name="CopyLibFiles">
<Copy SourceFiles="@(LibFiles)" DestinationFolder="$(ProjectDepthPath)$(LibFolder)" SkipUnchangedFiles="True" />
</Target>
<ItemGroup>
<LibFiles Include=" ">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
</Project>
次に、Visual Studioの.csprojファイルは、次のカスタムターゲットファイルと統合されます。
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" ... >
...
<Import Project="..\..\..\..\build\OurBuildTargets.targets" />
<ItemGroup>
<LibFiles Include="$(OutputPath)$(AssemblyName).dll">
<Visible>false</Visible>
</LibFiles>
</ItemGroup>
<Target Name="BeforeClean" DependsOnTargets="DeleteLibFiles" />
<Target Name="AfterBuild" DependsOnTargets="CopyLibFiles" />
</Project>
簡単に言うと、このビルドスクリプトは、最初にMSBuildにカスタムビルドスクリプトをロードするように指示し、次にコンパイルされたファイルをLibFiles
ItemGroupに追加し、最後にカスタムビルドターゲットをビルドプロセスに結び付けDeleteLibFiles
ますCopyLibFiles
。ソリューション内のプロジェクトごとにこれを設定し、更新されたファイルのみが削除/コピーされ、各プロジェクトが独自のファイル(dll、イメージなど)を担当するようにします。
これがお役に立てば幸いです。アウトオブプレースビルドシステムの意味を誤解してしまった場合は、お詫び申し上げます。これはまったく役に立たないことです。
ディレクトリのマクロを定義して出力パスで使用する方法はありますか
プロジェクトのビルド前およびビルド後のイベントを見たことがありますか?
実際、ビルド前およびビルド後のイベントは、バッチ ファイル タイプのコマンドを追加するためだけの場所のようです。残念ながら、これは私たちのプロジェクトの標準ビルド ディレクトリを設定するのに役立ちません。そして、これらのイベントでバッチ ファイルを作成することは、C# や IMO などの最新の言語に対する 1980 年代のアプローチのように思えます。
さらに掘り下げて実験した結果、 <Import> ディレクティブを .csproj ファイルに追加できることがわかりました。これを行うと、プロジェクトに安全でないエントリ ポイントがあることを示す警告ダイアログが IDE によってポップアップ表示されますが、これは無視でき、レジストリ エントリを編集することでまったく表示されないようにすることもできます。したがって、これにより、必要なディレクトリ パスを含む変数を .csproj ファイルに取得する方法が得られます。
ここで、参照する出力パスを取得します。残念ながら、「$(MySpecialPath)/Debug」のような文字列を [出力パス] フィールドに追加してプロジェクトを保存すると、$ と () の文字が 16 進数に変換され、ファイルは、「$(MySpecialPath)」という名前のディレクトリの下のデバッグ ディレクトリに配置されます。ああああ。ただし、テキスト エディターで .csproj ファイルを編集する場合は、これを正しく設定できます。出力パスを含む <PropertyGroup> の前に <Import> タグが表示されている限り、機能するようです。
したがって、私にとっての解決策は、標準の OurTeam.targets MsBuild ファイルを標準の場所に作成し、レジストリを変更するためのインストーラーを追加して、警告が表示されないようにし、このファイルを <インポート> するカスタム プロジェクト テンプレートを作成することです。また、OurTeam.targets ファイルで定義されたプロパティを使用するように [出力パス] を設定します。残念ながら、これは C++ のプロパティ シート継承メカニズムよりも手間がかかり、洗練されていないソリューションです。