NuGet Pack:忽略默认包含项

8
这与我通常阅读到的相反,那些人试图将文件包含在NuGet包中。我正在尝试停止自动包含文件。
我正在创建一个预编译的MVC视图模板库(使用RazorGenerator.Mvc)、.less文件和支持这些文件所需的JavaScript。想法是这些都是基本的东西,适用于我们所有的站点。
默认情况下,nuget pack会包括项目中标记为Build Action: Content的任何文件,其中任何新创建的视图、.less文件或脚本也是如此。似乎没有覆盖此行为的选项。这里提出了一个相关问题的解决方案,即在.nuspec中使用空的节点来停止所有包含,但我想包括一些文件,只选择我需要的文件。
现在,作为一种权宜之计,我可以显式地设置所有内容不是Content(使用None代替),然后使用.nuspec文件显式地设置我要复制哪些文件以及我想将它们复制到哪里。但是,如果另一个开发人员出现了,比如我的未来自己,并忘记了这个步骤,那么新添加的文件将被复制到包中,然后在下次安装或更新期间复制到目标项目中。
我发现了OctoPack,如果在.nuspec中检测到节点,则默认情况下不包含任何内容,但我没有使用TeamCity的其他任何东西,并且重写我的构建服务器脚本以了解如何调用OctoPack而不是nuget pack并不是一个好选择。 OctoPack也有局限性; 依赖项必须手动列出,在命令行上必须传递.nuspec文件的替换标记(而不是从AssemblyInfo.cs中读取),并且似乎该工具并不是为此用途而设计的 - 他们甚至说“OctoPack只应安装在您要部署的项目上 - 这意味着控制台应用程序项目、Windows服务项目和ASP.NET Web应用程序.单元测试、类库和其他支持项目不会被选中。”(OctoPack文档
我尝试的下一个替代方法是使用msbuild在BeforeBuild事件期间简单地清除Content组:
<Target Name="BeforeBuild">
    <ItemGroup>
      <Content Remove="**\*.*" />
      <None Include="**\*.*" />
    </ItemGroup>
  <Message Text="Content files: @(Content)" Importance="High" />
</Target>

该消息验证了Content组为空,但是nuget pack似乎并不在意;它仍然包含所有文件。有人成功地创建过这样的软件包吗?而不必手动标记所有内容为Build Action:None,也不使用OctoPack?
2个回答

6
看起来如果你调用 nuget pack MyProject.nuspec (而不是只有 nuget pack,它会查找.csproj.nuspec),你可以获得期望的行为,尽管你仍然(就像OctoPack一样)失去了令牌替换和自动依赖项。因此,这并不是一个完美的解决方案,理想的解决方案类似于--no-default-content,但它已经足够完成工作。 nuget pack MyProject.nuspec -Properties version={XYZ}(其中XYZ由构建服务器填充)至少让我确保版本号正确递增。例如,我可以在.nuspec中设置 <version>1.1.0.$version$</version> 然后将SVN修订版用作最后一部分。

所以这不是一个完美的解决方案,更完美的解决方案是让你在 .nuspec 文件中编写一些内容来控制它。谁会记住每次传递给 nuget 的参数呢? - binki
使用持续集成服务器的任何人都不必记住。现在我必须记住,如果我添加新的依赖项或更改依赖项版本,则必须手动将其添加到nuspec中,而不能从packages.config中读取该数据。 - Carl Bussema
不起作用。仅指定.nuspec仍会默认包含所有内容。在解决方案级别尝试。¯\(ツ) - Miha Markic

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

一个简单的方法是使用以下脚本:

使用Powershell从.zip文件中删除文件

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接