2013-09-26 122 views
2

我的同事们很困惑,从Visual Studio中我可以构建一个解决方案,并自动从项目中创建NuGet包。当然,这是因为我加入到我的csproj文件,以下以第一的PropertyGroup:“BuildPackage”属性记录在哪里?

<BuildPackage>true</BuildPackage> 

我的同事不相信这种能力,并且不希望采用它,因为他们看不到它的任何地方记录。他们担心这是一个不应该被利用的不受支持的定制。

我认为他们的结论是错误的,但我确实承认没有文件是奇怪的。我知道这个功能的唯一原因是因为我读了NuGet.targets文件。事后搜索文档,我发现互联网上唯一发现的是一篇简单提到BuildPackage property的SO帖子。

我们可以做得比这更好吗?哪里有提到这个属性的文档,以及如何以及何时使用它?听到“这种使用被禁止是因为它没有记录”,这是一种耻辱。

回答

1

我知道这篇文章有点旧,但我也利用这个属性,并且很好奇,知道它的命运。让“功能”正确工作的最简单方法是在我的解决方案中使用“启用NuGet软件包还原”,然后将该属性添加到我想要输出软件包的项目中。这样我就不需要将Nuget.targets导入和$(SolutionDir)属性定义添加到我的解决方案中的每个项目中。这是一个很棒的“功能”,因为只要我的AssemblyInfo元数据是正确的,我就不需要维护.nuspec文件。目前为止它工作得很好......直到我发现从Nuget 2.7开始,“启用NuGet包恢复”方法被认为是过时的,不应该使用。所以......知道这个“功能”是否应该被使用是很好的。

+0

这不是一个答案,更像是问题的延伸。 –

+1

你是对的,我应该添加它作为评论。我羞于垂头。 – user3723367

3

通过将BuildPackage属性为您的项目文件记录/透明(见下文)创建你的包,但的NuGet队no longer recommends使用添加对属性的支持机制,“MSBuild的集成包还原”:

在NuGet 2.7之前,MSBuild集成包恢复方法是 使用和推广。尽管这种方法仍然可用,但NuGet 团队建议使用“自动软件包还原”和命令行代替。

相应地,在3.0版的NuGet Visual Studio扩展中,“启用NuGet包恢复”上下文菜单项will be removed

正如您发现的那样,BuildPackage是在您执行“启用NuGet包恢复”时,Visual Studio添加到您的解决方案中的.nuget\NuGet.targets MSBuild文件中定义的目标。

<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites"> 
    <Exec Command="$(BuildCommand)" 
      Condition=" '$(OS)' != 'Windows_NT' " /> 

    <Exec Command="$(BuildCommand)" 
      LogStandardErrorAsError="true" 
      Condition=" '$(OS)' == 'Windows_NT' " /> 
</Target> 

Exec任务调用cmd.exe; $(BuildCommand)是在同一文件中定义的属性:您的解决方案目录中

<BuildCommand> 
$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols 
</BuildCommand> 

$(NuGetCommand)将评估为.nuget\NuGet.exe

因此,将来虽然自动添加这些msbuild节点将不被支持,但您可以自己将它们添加到项目中或使用其他方法来执行完全相同的(完全支持的)命令行nuget pack