NuGet Pack:忽略默认包含

NuGet Pack: ignore default includes

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

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

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

现在,作为权宜之计,我可以通过明确设置所有内容都不是 Content(使用 None相反),然后使用 .nuspec 文件明确设置我要复制和不想复制的文件以及我希望将它们复制到的位置。但是,如果出现另一个开发人员,比如我未来的自己,忘记了这一步,那么新添加的文件将被复制到包中,然后在下一次安装或更新时复制到目标项目中。

我找到了 OctoPack,一旦它在 .nuspec 中检测到 <files> 节点,默认情况下它不会包含任何内容,但我不使用 TeamCity 中的任何其他东西,并重写我的构建服务器脚本以了解如何调用 OctoPack 而不是 nuget pack,这并不是一个很好的选择。 OctoPack 也有局限性;依赖项必须手动列出,.nuspec 文件的替换标记必须在命令行中传递(而不是从 AssemblyInfo.cs 中读取),而且该工具似乎不是为此而设计的使用——他们甚至说 "OctoPack should only be installed on projects that you are going to deploy - that means the console application projects, Windows Service projects, and ASP.NET web applications. Unit tests, class libraries, and other supporting projects wouldn't be selected." (OctoPack Documentation)

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

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

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

有没有人成功创建了这样的包,而无需手动标记所有构建操作:None 并且不使用 OctoPack?

似乎如果您调用 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 修订版作为最后一部分。

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

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

Remove files from .zip file with Powershell

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