“Nuget pack”似乎忽略了BasePath参数。

4
我正在尝试使用我们的TFS 2013构建创建NuGet包。我基本上遵循了步骤,本地一切正常。
但是我们的构建不使用默认输出目录,这似乎会导致nuget pack命令失败。
在我的本地机器上,所有内容都构建到SOLUTION / PROJECT / bin / Release中,但是TFS构建使用BUILD / Sources / SOLUTION / PROJECT作为其源目录,BUILD / Binaries / Release作为其输出目录。 运行构建,我得到以下日志/错误:

BuildPackage:
“D:\ BUILD \ Sources \ SOLUTION \.nuget \ NuGet.exe”pack“D:\ BUILD \ Sources \ SOLUTION \ PROJECT \ PROJECT.csproj”-属性“Configuration = Release; Platform = AnyCPU”-NonInteractive -OutputDirectory“D:\BUILD \ Binaries \ Release”-symbols-NoPackageAnalysis-BasePath“D:\ BUILD \ Binaries \ Release” 尝试从“PROJECT.csproj”构建包。

D:\ BUILD \ Sources \ SOLUTION \.nuget \ NuGet.targets(133,5):错误:无法找到“D:\ BUILD \ Sources \ SOLUTION \ PROJECT \ bin \ Release \ PROJECT.dll”。请确保已经构建了该项目。

然后我在NuGet.targetsBuildCommand中添加了-BasePath“ $(TargetDir)”,但仍然没有改变:

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

如何告诉NuGet使用TFS加载正确的文件?

更新:
我找到了一个解决办法:如果我将项目的构建输出路径设置为与我们的TFS构建使用的相同的“相对路径”,它就可以工作...
但这不能是最终解决方案,对吧?

2个回答

9
在我自己的TFS构建中,我遇到了和你完全相同的问题。问题在于,当使用csproj文件调用NuGet pack时,它会将csproj作为MSBUILD文件进行评估,并且默认的OutDir MSBUILD属性设置为{ProjectDir}\bin\{ConfigurationName}
但是,在TFS构建中,输出目录通常设置为一个暂存位置,例如在您的情况下为BUILD/Binaries/Release
您所缺少的是将OutDir属性添加到NuGet pack中,这里有一个示例应该可以解决您的问题: <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform);OutDir=$(OutDir)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols -NoPackageAnalysis -BasePath "$(TargetDir)"</BuildCommand> 通过添加这个额外的OutDir属性,NuGet应该能够找到您新生成的二进制文件并将其添加到包中。

谢谢您的建议,但是这个“项目”现在已经“搁置”了,因为它目前正在使用解决方案工作,并且在TFS 2015中,此类操作(NuGet打包和发布)得到了本地支持,所以我们不再花时间“手动操作”它了;-) … - Christoph Fink
3
从http://nuget.codeplex.com/workitem/1486:OutDir必须以反斜杠\结尾(在Windows上)。当OutDir包含空格时,必须加引号,但是命令行解析中存在另一个错误/特性-在引号之前的反斜杠必须加倍。完整的解决方法是 - Properties OutDir =“ $(OutDir.Trim('\'))\”。 - Joachim Chapman
这对我有用。我必须在$(TargetDir)后面添加一个空格:<BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform);OutDir=$(OutDir.Trim('\'))\" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols -BasePath "$(TargetDir) "</BuildCommand> - bkaid

-1

设置OutDir或其他路径相关参数可能不足够。例如,如果您的.nuspec通过相对路径包含文件,则无法找到它们。

对我们有效的是为nuget pack指定-Build选项。来自文档

Build:确定在构建包之前是否应构建项目。

它将首先尝试构建项目(使用默认参数+提供的属性),并将正确找到所有包含文件的输出文件。


1
不使用“-Build”参数,nuget.exe会查找TFS构建代理创建的输出文件。重复构建并不是一个好主意,更重要的是:NuGet.exe不会传递与TFS构建代理相同的MSBuild参数。 - Steven Liekens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接