在清理我继承的项目的文件夹/文件结构的过程中,我遇到了组织所需外部库的问题。我想将它们保存在自己的.\dll\
文件夹中,但它们不会被正确复制到构建目录中。它们应该位于根构建目录中,但它们将被移动到子文件夹中。
我的.csproj
文件包含以下xml:
<Project>
<ItemGroup>
<None Include="dlls\libraryA.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
然后,在构建时,libraryA.dll
文件被复制到bin\Debug\dll\
文件夹,但我希望它在bin\Debug\
文件夹中。
答案 0 :(得分:15)
我试过这个并且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的一部分执行的目标列表中。
此示例复制无项目组中的所有项目。您可以创建自己的项目组(例如MyFiles),如果您有其他“无”复制文件,则可以对该项目组进行复制。当我尝试这个时,我不得不通过直接编辑csproj文件来更改项目组名称。 Visual Studio不允许我从UI设置文件的项目组,但在我编辑csproj并更改它之后,Visual Studio正确显示了我的自定义项目组名称。
答案 1 :(得分:5)
如果您只想为一个文件更改它,则可能更容易使用该属性:
<None Include="dlls\libraryA.dll">
<Link>%(Filename)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
Including content files in .csproj that are outside the project cone
答案 2 :(得分:0)
此方法有效
如果您需要将特定的文件/ 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>