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

时间:2019-07-09 18:45:48

标签: visual-studio nuget nuget-package nuget-spec

我正在建立一个具有如下文件夹层次结构的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

请注意,仅使用“ nuget spec”命令即可生成nuspec文件,然后添加以下文件部分:

<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 Packer认为,除非明确要求,否则不应将“ .pp”文件放置在内容中。但是不必要地复制所有其他文件(在所有其他文件夹中),并且不希望将它们放在那里-因为使用该软件包时,该文件夹也在目标项目中也被复制。

我认为也许在nuspec中这样的事情会有所帮助:

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

但是我为“ exclude”属性尝试过的所有变体似乎都无济于事。

如何从内容文件夹中排除“ StuffToInclude”文件?

非常感谢。

1 个答案:

答案 0 :(得分:1)

  

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

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

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

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

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

问题原因:

我已经进行了一些测试,发现当我们将Project.nuspec文件放入项目dir并使用诸如nuget pack xx.csproj这样的命令时,nuget.exe将从两者读取数据 xx.nuspec and xx.csproj,这就是为什么您需要第二份副本。

如果在同一目录中 nuget pack xx.csproj,则xx.nuspec

1#结构:

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

nuget pack xx.nuspec的2#结构:

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

当您基于存在ProjectName.nuspec的项目文件(.csproj)使用nuget pack命令时,它将同时从.csproj和.nuspec读取数据。因此它会像您得到的那样产生第二份副本。

要解决此问题:

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

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

  3. 同时保留xx.nuspec文件和xx.csproj文件(请参见下文)以及xx.nuspec文件中所需的所有内容,但要避免不必要的第二件事情,请确保每个单独的项目您不想将两次复制设置为Build Action中的None