3

ソリューションをビルドし、コンパイル済みのすべてのバイナリと依存関係を特定の出力フォルダーにコピーする msbuild スクリプトを作成しようとしています。私たちが持っているビルドスクリプトはバイナリをビルドして共通フォルダーにコピーしますが、依存関係はコピーされません。これはおそらく、msbuild タスクを使用してソリューションをビルドした方法に関係しており、タスクのターゲット出力をアイテム グループに受け入れ、アイテム グループを反復処理して、コンパイルされたすべての dll と exe を共通フォルダーにコピーしています。ただし、これには、各プロジェクトの個々の bin フォルダーに配置される依存関係 dll は含まれません。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
    <ParentSolutionFile />
</PropertyGroup>
<ItemGroup>
    <Assemblies Include="*.dll, *.exe" />
</ItemGroup>
<Target Name="BuildAll">
    <CombinePath BasePath="$(MSBuildProjectDirectory)" Paths="Source\Solutions\xxx.sln">
        <Output TaskParameter="CombinedPaths" PropertyName="ParentSolutionFile" />
    </CombinePath>
    <Message Text="$(ParentSolutionFile)" />
    <MSBuild Projects="$(ParentSolutionFile)">
        <Output TaskParameter="TargetOutputs" ItemName="Assemblies" />
    </MSBuild>
    <Message Text="%(Assemblies.Identity)" />
    <Copy SourceFiles="%(Assemblies.Identity)" DestinationFolder="$(MSBuildProjectDirectory)\Binary" OverwriteReadOnlyFiles="True" SkipUnchangedFiles="True" />
</Target>

すべてのバイナリと必要な依存関係を共通の出力フォルダーにコピーするには、どのような方法が望ましいでしょうか?

4

2 に答える 2

2

OutputPath をオーバーライドしないとうまくいきませんか?

<MSBuild Projects="$(ParentSolutionFile)" Properties="OutputPath=$(MSBuildProjectDirectory)\Binary">
  <Output TaskParameter="TargetOutputs" ItemName="Assemblies" />
</MSBuild>

そして、コピー タスクをすべて除外しますか?

于 2013-05-15T13:18:27.570 に答える
1

ビルド プロセスは、最終結果を OutputPath で表されるディレクトリに配置します (少なくとも C# プロジェクトをビルドしている場合)。C/C++ の場合、内部構造と変数名は完全に異なります。

したがって、理論的には、ソリューションをビルドする MsBuild タスクで OutputPath を渡すことができます。

<MsBuild Projects="$(ParentSolutionFile)"
    Properties="OutputPath=$(MSBuildProjectDirectory)\Binary"/>

ただし、csproj-files は、次のコードで無条件にその値を上書きします。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\Debug\</OutputPath>

私は、すべての csproj ファイルに独自のビルド システムを挿入することで、これを解決しました。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\..\..\build\buildsystem.targets" />

パスは、csproj ファイルからの相対パスです。絶対パスでもいいですし、変数でも構いません。秘訣は、すべての開発マシンとビルド エージェントで動作するようにすることです。

次に、buildsystem.targets で、OutputPath好きなだけ再定義します。繰り返しになりますが、ビルドの実行者 (開発者、ビルド エージェント) やビルドの開始方法 (VS、コマンド ライン) に関係なく、確実に同じ場所、または少なくとも明確に定義された場所を取得することが秘訣です。

違いを処理する簡単な方法は、条件付きでインポートすることです。

<Import Project="..\..\..\build\buildsystem.targets"
    Condition="'$(BuildingInsideVisualStudio)'!='true'"/>

VS からビルドを開始する場合は何も変更されず、コマンド ラインからビルドする場合はコードを変更しても変更はありません。

--ジェスパー

于 2013-11-15T08:27:20.160 に答える