【问题标题】:How to stop NuGet packaging from including unwanted files如何阻止 NuGet 打包包含不需要的文件
【发布时间】:2019-07-09 18:45:48
【问题描述】:

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

但我为“排除”属性尝试的所有变体似乎都没有帮助。

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

非常感谢。

【问题讨论】:

  • 我按照你的步骤得到了你想要的。所以我想也许你在打包过程中犯了一些错误,你能分享更多的.nuspec内容吗?(删除id,作者等个人数据)你使用命令nuget specnuget pack xx.xxspec吗?如果没有,请分享您使用的真实命令。

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


【解决方案1】:

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

我假设您在创建包时使用的命令类似于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@987654332读取数据@,这就是为什么你有第二个副本。

1# nuget pack xx.csproj 的结构如果 no xx.nuspec 在同一目录中:

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文件(或删除&lt;Files&gt; section)并使用nuget pack xx.csproj之类的命令,将那些xx.cs.pp文件包含到内容文件夹中,您可能需要将它们的build action设置为@ 987654344@.

  3. 保留 xx.nuspec 文件和 xx.csproj 文件(见下文)以及 xx.nuspec 文件中您想要的所有内容,但为避免不必要的第二个副本,请确保每个项目你不想复制两次设置为Build ActionNone

【讨论】:

  • 谢谢兰斯。我已经尝试过您的两个解决方案,但都不是理想的。我专门创建了 NuSpec 文件,以便我可以列出框架依赖项、文件等。但是,当它生成时,它具有引用来自 MSBuild 的可变参数(如 $id$ 的标题等)的绝妙能力,但仅当包针对项目文件而不是 nuspec 文件时。所以似乎有很多想法让整个过程变得非常方便,但似乎确实因为这个问题留下了一个漏洞。还有其他见解吗?
  • 对您的决议 #2 进行进一步试验.... 似乎唯一的方法是使用您想要复制到目标消费项目的实际内容来污染源项目的目录层次结构NuGet。所以我想我已经确认它在理论上是可行的,但肯定有点丑陋且难以维护。
  • Lance - 你的工作激发了我解决这个问题的能力 - 我编辑了你的解决方案以包含一个新的 #3 解决方案,如下所示:“保留 xx.nuspec 文件和 xx.csproj 文件(请参阅下面)以及您想要在 xx.nuspec 文件中的所有内容,但为了避免不必要的第二次复制,请确保您不想复制两次的每个项目都设置为“无”的构建操作。”谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多