【发布时间】: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)
我尝试的下一个替代方法是使用msbuild 在BeforeBuild 事件期间简单地清除内容组:
<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