継承したプロジェクトのフォルダー/ファイル構造をクリーンアップする過程で、必要な外部ライブラリの整理に問題が発生しました。それらを独自の.\dll\
フォルダーに保持したいのですが、ビルドディレクトリに正しくコピーされていません。それらはルートビルドディレクトリにあるはずですが、代わりにサブフォルダに移動されています。
私の.csproj
ファイルには次のxmlが含まれています。
<Project>
<ItemGroup>
<None Include="dlls\libraryA.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
次に、ビルド時に、libraryA.dll
ファイルがbin\Debug\dll\
フォルダーにコピーされますが、bin\Debug\
フォルダーに配置する必要があります。
私はこれを試しましたが、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はカスタムアイテムグループ名を正しく表示しました。
1つのファイルに対してのみ変更する場合は、次のプロパティを使用する方が簡単な場合があります。
<None Include="dlls\libraryA.dll">
<Link>%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
このアプローチは機能します
特定のファイル/ 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>