这与我通常阅读的问题相反,即人们试图将文件包含在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)
我尝试的下一个替代方法是使用msbuild
在BeforeBuild
事件期间简单地清除内容组:
<Target Name="BeforeBuild">
<ItemGroup>
<Content Remove="**\*.*" />
<None Include="**\*.*" />
</ItemGroup>
<Message Text="Content files: @(Content)" Importance="High" />
</Target>
该消息验证内容组是否为空,但nuget pack
似乎并不关心;它仍然包括所有文件。
有没有人成功创建过这样的软件包,而无需手动标记所有内容构建操作:无而不使用OctoPack?
答案 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。