"Nuget pack" 似乎忽略了 BasePath 参数

"Nuget pack" seems to ignore BasePath parameter

我正在尝试使用我们的 TFS 2013 版本创建一个 NuGet 包。我基本上遵循了 THIS 个步骤,在本地一切正常。
但是我们的构建不使用默认输出目录,这似乎会使 nuget pack 命令崩溃。
在我的本地机器上,所有内容都内置在 SOLUTION/PROJECT/bin/Release 中,但 TFS Build 使用 BUILD/Sources/SOLUTION/PROJECT 作为源代码,并使用 BUILD/Binaries/Release 作为其输出目录。 运行 我得到以下构建 log/error:

BuildPackage:
"D:\BUILD\Sources\SOLUTION\.nuget\NuGet.exe" pack "D:\BUILD\Sources\SOLUTION\PROJECT\PROJECT.csproj" -Properties "Configuration=Release;Platform=AnyCPU" -NonInteractive -OutputDirectory "D:\BUILD\Binaries\Release" -symbols -NoPackageAnalysis -BasePath "D:\BUILD\Binaries\Release" Attempting to build package from 'PROJECT.csproj'.

D:\BUILD\Sources\SOLUTION\.nuget\NuGet.targets(133,5): error : Unable to find 'D:\BUILD\Sources\SOLUTION\PROJECT\bin\Release\PROJECT.dll'. Make sure the project has been built.

然后我将 -BasePath "$(TargetDir)" 添加到 NuGet.targets 中的 BuildCommand,但仍然没有变化:

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

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

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

我在自己的 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 应该能够找到您新构建的二进制文件并将它们添加到包中。

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

对我们有用的是为 nuget pack 指定 -Build 选项。来自 the docs:

Build : Determines if the project should be built before building the package.

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