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

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

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

现在,作为权宜之计,我可以完成操作,将所有内容明确设置为不包含内容(改为使用无),然后使用.nuspec文件明确设置要复制和不复制的文件以及要将它们复制到的位置。但是,如果另一个开发人员(例如我 future 的自己)走了而忘记了这一步,那么新添加的文件将被复制到程序包中,然后在下一次安装或更新期间复制到目标项目中。

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

我尝试的下一个替代方法是使用msbuildBeforeBuild事件期间简单地擦除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?

最佳答案

看来,如果您调用 nuget pack MyProject.nuspec (而不是nuget pack,它会同时查找.csproj.nuspec),尽管您仍然(像使用OctoPack一样)丢失了 token 替换和自动依赖项,但是您可以获得所需的行为。因此,这不是一个完美的解决方案,类似于--no-default-content,但它可以很好地完成工作。
nuget pack MyProject.nuspec -Properties version={XYZ}(构建服务器在其中填充XYZ)将至少让我确保版本号也正确递增。例如,我可以在.nuspec中设置
<version>1.1.0.$version$</version>,然后仅使用SVN修订版作为最后一部分。

10-04 14:49