我有一个通过 nuget 导入到另一个项目的库。但是,在目标项目中,“复制到输出目录”始终设置为“不复制”。即使我之前将其设置为“始终复制”并且进行了更新,也会发生这种情况;它将其重置为“不复制”。我希望它是“始终复制”(或者至少在更新后保留以前的设置)。
为了实现这一目标,我尝试创建一个 .targets 文件,如以下问题所述:
在 nuget 包中将内容文件设置为“复制本地:始终”以及如何在 nuspec 文件中设置“复制到输出目录”属性?
但是,它似乎并不适合我,而且我不确定我的情况是否与这些问题中描述的完全相同。
目标项目的.csproj文件中最终的内容是:
<Content Include="Assets\Devices\MyProj.Devices.Test.NugetTesting.dll" />
而我想要的是
<Content Include="Assets\Devices\MyProj.Devices.Test.NugetTesting.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
我的 nuspec 文件是:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata>
<version>$version$</version>
<authors>komodosp</authors>
<owners>komodosp</owners>
<id>MyProj.Devices.Test.NugetTesting.dll</id>
<title>MyProj.Devices.Test.NugetTesting</title>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Device implementation library for nuget testing</description>
<copyright>Copyright komodosp 2024</copyright>
<dependencies>
<dependency id="MyProj.Devices.Interfaces" version="2.0.*" />
</dependencies>
</metadata>
<files>
<file src="MyProj.Devices.Test.NugetTesting.targets" target="Build\" />
<file src="bin\Release\MyProj.Devices.Test.NugetTesting.dll" target="content\Assets\Devices" />
</files>
</package>
我的目标文件 - 我将其放置在项目目录的“根”目录中(即与 csproj 文件相同的目录)并称为 MyProj.Devices.Test.NugetTesting.targets 是:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(ProjectDir)content\Assets\Devices\MyProj.Devices.Test.NugetTesting.dll">
<Link>MyProj.Devices.Test.NugetTesting.dll</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
(...如上面链接的问题中所述)
另外,如果我想在目标 .csproj 文件中将它作为
<None>
,我不应该使用 <Content>
,我也尝试过这个 .targets 文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="$(ProjectDir)\content\Assets\Devices\MyProj.Devices.Test.NugetTesting.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
如果我下载 .nupkg 文件并将其解压缩,我可以看到 .targets 文件位于 Build 目录中。但是,在 Visual Studio 中,当我恢复包时,我在输出选项卡的日志中没有看到任何提及 .targets 文件的内容(不确定是否应该有),所以我什至不知道它是否正在查找
最后,dll 始终更新到正确的位置,但“复制到输出目录”设置为“不复制”。
原来我一直误解了 .targets 文件如何导入到客户端项目中。
它不会导致项目本身更新,因此在 Visual Studio 中查看时,该属性不会反映新设置并保持“不复制”状态。
但是,由于 .targets 文件是通过自动添加的
<Import>
标签导入到 .csproj 中的,因此该文件最终仍会被复制到构建输出。
郑重声明,我的 .targets 文件中也存在一个错误 - 这是我最终使用并工作的文件。 (即文件路径中不需要“内容”)
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="$(ProjectDir)\Assets\Devices\MyProj.Devices.Test.NugetTesting.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>
感谢马丁·克里斯蒂安森对这个答案的评论