NuGet Pack:忽略默认包含

时间:2015-01-13 15:56:54

标签: msbuild nuget nuget-package

这与我通常阅读的问题相反,即人们试图将文件包含在NuGet包中。我正在尝试停止文件自动包含。

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

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

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

我找到 OctoPack ,一旦检测到<files>中的.nuspec节点,默认情况下不会包含任何内容,但我没有使用其他任何内容TeamCity,并重写我的构建服务器脚本,以了解如何调用OctoPack而不是nuget包,这并不是一个很好的选择。 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似乎并不关心;它仍然包括所有文件。

有没有人成功创建过这样的软件包,而无需手动标记所有内容构建操作:而不使用OctoPack?

2 个答案:

答案 0 :(得分: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修订作为最后一部分。

答案 1 :(得分:0)

另一个解决方案(仍然不理想,但至少你可以继续传递.csproj文件而不失其优点)是删除生成的.nupkg文件的contents文件夹(通过将其视为.zip)。 / p>

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

Remove files from .zip file with Powershell

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