web-dev-qa-db-ja.com

MSBuildプロジェクトファイル:アイテムを出力ディレクトリの特定の場所にコピーします

継承したプロジェクトのフォルダー/ファイル構造をクリーンアップする過程で、必要な外部ライブラリの整理に問題が発生しました。それらを独自の.\dll\フォルダーに保持したいのですが、ビルドディレクトリに正しくコピーされていません。それらはルートビルドディレクトリにあるはずですが、代わりにサブフォルダに移動さ​​れています。

私の.csprojファイルには次のxmlが含まれています。

<Project>
  <ItemGroup>
    <None Include="dlls\libraryA.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>
</Project>

次に、ビルド時に、libraryA.dllファイルがbin\Debug\dll\フォルダーにコピーされますが、bin\Debug\フォルダーに配置する必要があります。

21
chezy525

私はこれを試しましたが、msbuildは常にディレクトリパスを使用してファイルをコピーしたいのですが、回避策があります...

Csprojファイルを編集し、この行の後に:

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

次の行を追加します。

  <PropertyGroup>
    <PrepareForRunDependsOn>$(PrepareForRunDependsOn);MyCopyFilesToOutputDirectory</PrepareForRunDependsOn>
  </PropertyGroup>

  <Target Name="MyCopyFilesToOutputDirectory">
    <Copy SourceFiles="@(None)" DestinationFolder="$(OutDir)" />
  </Target>

出力ファイルのコピーは、PrepareForRunターゲットで行われます。これにより、PrepareForRunの一部として実行されるターゲットのリストに独自のターゲットが追加されます。

この例では、Noneアイテムグループのすべてのアイテムをコピーします。独自のアイテムグループ(MyFilesなど)を作成し、コピーしたくない他の「なし」ファイルがある場合は、そのアイテムグループでコピーを実行できます。これを試したとき、csprojファイルを直接編集してアイテムグループ名を変更する必要がありました。 Visual StudioではUIからファイルのアイテムグループを設定できませんでしたが、csprojを編集して変更した後、VisualStudioはカスタムアイテムグループ名を正しく表示しました。

21
Brian Walker

1つのファイルに対してのみ変更する場合は、次のプロパティを使用する方が簡単な場合があります。

<None Include="dlls\libraryA.dll">
  <Link>%(Filename)%(Extension)</Link>
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

プロジェクトコーンの外側にある.csprojのコンテンツファイルを含む

8
Jaws

このアプローチは機能します

特定のファイル/ nugetパッケージのコピーをasp.netコアプロジェクト(2.2)に強制する必要がある場合は、csprojの最後に次を追加します。

<!-- Force copy MathNet because we need it in compilation -->
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="Build">
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll'))" />
</Target>

<ItemGroup>
    <ContentWithTargetPath Include="..\packages\MathNet.Numerics.4.8.1\lib\netstandard2.0\MathNet.Numerics.dll">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>MathNet.Numerics.dll</TargetPath>
    </ContentWithTargetPath>
</ItemGroup>
0
gab89