假设我有以下项目结构:
ExecutableProject
|
__ Project A
|
__ Project B
|
__ ContentFilesNugetPackage
NuGet 包包含库 B 在运行时需要的一些资产。包的 nuspec 文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>test.package</id>
<version>1.0.0</version>
<description>Test content</description>
<authors>demo</authors>
<contentFiles>
<files include="**/*" buildAction="content" copyToOutput="false" flatten="false" />
</contentFiles>
</metadata>
</package>
问题是:assets 不仅会被复制到 ExecutableProject 的输出路径,还会复制到 Project A 和 Project B 的输出路径。这是一个问题,如果有很多 nuget 包,有很多资产文件和项目依赖关系图很深,因为它增加了构建时间。
我通过添加一个 buildTransitive .targets 文件来使其工作,该文件仅在项目是可执行项目时复制内容文件:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"ToolsVersion="15.0">
<!-- copy content to build output for executable projects only -->
<Target Name="AfterBuild" AfterTargets="Build" Condition="$(OutputType) == 'Exe'">
<ItemGroup>
<_ContentFiles Include="$(MSBuildThisFileDirectory)..\contentFiles\any\any\**\*" />
</ItemGroup>
<Copy SourceFiles="@(_ContentFiles)" DestinationFolder="$(OutDir)\%(RecursiveDir)"SkipUnchangedFiles="true" OverwriteReadOnlyFiles="true" />
</Target>
</Project>
我将 .nuspec 文件中的 copyToOuptut 设置为 false 以阻止 msbuild 将内容文件复制到每个库项目输出文件夹中。现在我的问题是,当我使用 dotnet publish 构建和部署应用程序时,nuget 包的依赖项也不会复制到目标文件夹,而这适用于 dotnet build。
我现在已经尝试将“buildtransitive.target”文件中的“AfterTargets”值设置为“Publish”,但它没有帮助。
也许有人和我有同样的问题,可以告诉我为什么 dotnet publish 不起作用但 dotnet build 起作用?