【问题标题】:NuGet Pack: ignore default includesNuGet Pack:忽略默认包含
【发布时间】:2015-01-13 15:56:53
【问题描述】:

这与我通常读到的相反的问题是人们试图获取 NuGet 包中包含的文件。我正在尝试停止文件被自动包含。

我正在创建一个包含预编译 MVC 视图模板(使用 RazorGenerator.Mvc)、.less 文件和 JavaScript 的库,以便根据需要支持这些模板。我们的想法是,这些是进入我们所有网站的基本内容。

默认情况下,nuget pack 在您的项目中包含任何标记为 Build Action: Content 的文件,任何新创建的视图、.less 文件或脚本都将包含这些文件。 似乎没有选项可以覆盖此行为。 此处的一个相关问题提出了empty <files> node in the .nuspec to stop all includes 的解决方案,但我想包含 一些 文件,只是那些我选择。

现在,作为权宜之计,我可以通过,明确将所有内容设置为不是 Content(使用 None 代替),然后明确设置我执行和不执行的文件'不想复制,我希望他们使用.nuspec 文件复制到哪里。但是,如果另一个开发者出现,例如我未来的自己,并且忘记了这一步,那么新添加的文件将被复制到包中,然后在下次安装或更新时复制到目标项目中。

我找到了 OctoPack,一旦它在 .nuspec 中检测到 <files> 节点,默认情况下将不包含任何内容,但我没有使用 TeamCity 中的任何其他内容,并重写我的构建服务器脚本以了解如何调用 OctoPack 而不是 nuget pack 对我来说并不是一个很好的选择。 OctoPack 也有局限性;依赖项必须手动列出,.nuspec 文件的替换标记必须在命令行中传递(而不是从AssemblyInfo.cs 读取),而且看起来该工具并非用于此用途- - 他们甚至说“OctoPack 应该只安装在你要部署的项目上——这意味着控制台应用程序项目、Windows 服务项目和 ASP.NET Web 应用程序。单元测试、类库和其他支持项目不会被选中。” (OctoPack Documentation)

我尝试的下一个替代方法是使用msbuildBeforeBuild 事件期间简单地清除内容组:

<Target Name="BeforeBuild">
    <ItemGroup>
      <Content Remove="**\*.*" />
      <None Include="**\*.*" />
    </ItemGroup>
  <Message Text="Content files: @(Content)" Importance="High" />
</Target>

消息验证内容组为空,但nuget pack 似乎并不关心;无论如何,它仍然包含所有文件。

有没有人成功地创建了这样的包,而无需手动标记所有内容 Build Action: None 并且不使用 OctoPack?

【问题讨论】:

    标签: msbuild nuget nuget-package


    【解决方案1】:

    看来,如果您调用 nuget pack MyProject.nuspec(而不仅仅是 nuget pack,它将同时查找 .csproj.nuspec),您可以获得所需的行为,尽管你仍然(就像使用 OctoPack 一样)丢失了令牌替换和自动依赖项。所以这不是一个完美的解决方案,类似于--no-default-content,但它可以很好地完成工作。

    nuget pack MyProject.nuspec -Properties version={XYZ}(其中 XYZ 由构建服务器填写)至少可以让我确保版本号也正确递增。比如我可以在.nuspec中设置

    &lt;version&gt;1.1.0.$version$&lt;/version&gt; 并且只使用 SVN 修订版作为最后一部分。

    【讨论】:

    • “所以这不是一个完美的解决方案,类似于--no-default-content”——更完美的解决方案是让您在 .nuspec 文件中编写一些内容来控制它。谁会去记住每次传递给nuget的参数?
    • 任何使用持续集成服务器的人都不必记住。现在我必须记住,如果我添加新的依赖项或更改依赖项版本,我必须手动将其添加到 nuspec,而不是能够从 packages.config 读取该数据。
    • 它不起作用。默认情况下,仅指定 .nuspec 仍包括所有内容。在解决方案级别尝试。 ¯\_(ツ)_/¯
    【解决方案2】:

    另一种解决方案(仍然不理想,但至少您可以继续传递 .csproj 文件而不会失去其优势)是删除生成的 .nupkg 文件的内容文件夹(将其视为 .zip)。

    一个简单的方法是通过这样的脚本:

    Remove files from .zip file with Powershell

    请注意,此脚本使用的 System.IO.Compression 仅适用于 PowerShell 3.0 和 .NET 4.5。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-11
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2014-02-13
      • 2021-01-06
      • 1970-01-01
      相关资源
      最近更新 更多