2015-01-13 104 views
6

这与我通常阅读的是相反的问题,即试图获取NuGet软件包中包含的文件的人。我试图停止文件被自动包含。NuGet软件包:忽略默认包括

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

默认情况下,nuget pack包括任何文件标记生成操作:在您的项目,其中任何新创建的视图,.less文件或脚本会内容似乎无法覆盖此行为。这里的一个相关问题提供了一个empty <files> node in the .nuspec to stop all includes的解决方案,但我想包括一些文件,只是我选择的文件。现在

,作为权宜之计,我可以顺利通过,明确设置的一切不被内容(使用代替),然后明确地设置哪些文件,我并不想复制,我想他们复制到使用.nuspec文件。但是,如果有其他开发人员(例如我未来的自己)出现并忘记了此步骤,则新添加的文件将被复制到软件包中,然后在下次安装或更新时复制到目标项目中。

我发现OctoPack,这将包括没有在默认情况下,只要它检测到.nuspec一个<files>节点,但我没有使用任何其他信息的TeamCity,和重写我的构建服务器的脚本,以了解如何调用OctoPack而不是nuget pack并不会让我成为一个不错的选择。 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?

回答

5

看来,如果你调用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修订版作为最后一部分。

+0

“所以这不是一个完美的解决方案,它会像'--no-default-content'” - 一个更完美的解决方案可以让你在.nuspec文件中编写一些东西来控制它。谁会去记住每次传递给'nuget'的参数? – binki

+0

任何使用持续集成服务器的人都不必记住。现在我必须记住,如果添加新的依赖项或更改依赖项版本,我必须手动将其添加到nuspec,而不是能够从packages.config中读取数据。 –

0

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

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

Remove files from .zip file with Powershell

注意System.IO.Compression - 使用这个脚本 - 仅使用PowerShell 3.0和.NET 4.5的作品。