如何阻止 NuGet 打包包含不需要的文件

How to stop NuGet packaging from including unwanted files

我正在构建一个 NuGet 包,其文件夹层次结构如下所示:

ProjectDir
    Infrastructure
        class1.cs
        class2.cs
    Task
        class3.cs
        class3.cs
    StuffToInclude
        SampleCode
            sampleclass1.cs.pp
            sampleclass2.cs.pp
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt
    Project.nuspec

注意 nuspec 文件是使用 "nuget spec" 命令生成的,然后添加以下文件部分:

<files>
    <file src="StuffToInclude\**\*.*" target="content" />
</files>

我期望(和想要)的是包中的内容文件夹,如下所示:

content
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

然而,我得到的是一个稍大的内容文件夹,其中包含 "StuffToInclude" 文件夹的第二个副本,如下所示:

content
    StuffToInclude
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

请注意,不需要的 StuffToInclude 文件夹中没有 SampleCode 子文件夹——不知何故,nuget 打包程序认为“.pp”文件不应放在内容中,除非明确要求。但是所有这些其他文件(在所有其他文件夹中)都被不必要地复制,并且不希望将它们放在那里 - 因为当包被使用时,该文件夹也会在目标项目中复制。

我认为 nuspec 中的类似内容可能会有所帮助:

<files>
    <file src="StuffToInclude\**\*.*" target="content" exclude="StuffToInclude\**\*.*"/>
</files>

但我为 "exclude" 属性尝试的所有变体似乎都没有帮助。

如何排除 "StuffToInclude" 文件不包含在内容文件夹中?

非常感谢。

How to stop NuGet packaging from including unwanted files

我假设您在创建包时使用的命令类似于 nuget pack xx.csproj

如果是这样,您在创建 .nuspec 文件后基于项目文件创建包的特殊原因是什么?

根据this document,我们可以根据指定的.nuspec or project file使用nuget pack命令。

所以通常情况下,如果我们基于.csproj创建一个包,则不需要创建.nuspec文件。另外,如果我们想创建一个基于 .nuspec 的包,我建议使用命令 nuget pack xx.nuspec 而不是 nuget pack xx.csproj.

问题原因:

我做了一些测试,发现当我们将 Project.nuspec 文件放在项目目录中,并使用像 nuget pack xx.csproj 这样的命令时,nuget.exe 将从 both xx.nuspec and xx.csproj,这就是为什么你有第二个副本。

1# nuget pack xx.csproj 的结构 if no xx.nuspec in same directory:

content
    StuffToInclude
        Images
            image1.gif
            image2.gif
        Doc
            text1.txt
            text2.txt

2# nuget pack xx.nuspec 的结构:

content
    SampleCode
        sampleclass1.cs.pp
        sampleclass2.cs.pp
    Images
        image1.gif
        image2.gif
    Doc
        text1.txt
        text2.txt

并且当您使用基于项目文件 (.csproj) 的 nuget pack 命令时,其中存在 ProjectName.nuspec,它会从 .csproj 和 .nuspec 中读取数据。所以它会像你得到的那样产生第二个副本。

解决方法:

  1. 保留 xx.nuspec 文件并使用类似 nuget pack xx.nuspec 的命令。(建议)

  2. 删除 xx.nuspec 文件(或删除 <Files> section)并使用类似 nuget pack xx.csproj 的命令将那些 xx.cs.pp 文件包含到内容文件夹中, 您可能需要将他们的 build action 设置为 content.

  3. 同时保留 xx.nuspec 文件和 xx.csproj 文件(见下文)以及 xx.nuspec 文件中您想要的所有内容,但要避免不需要的第二个事物的副本,请确保您不想复制两次的每个项目都设置为 NoneBuild Action