0

假设我有以下项目结构:

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 起作用?

4

0 回答 0