"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.
它将首先尝试构建项目(使用默认参数 + 提供的属性)并将正确找到包含所有包含文件的输出文件。
我正在尝试使用我们的 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.
它将首先尝试构建项目(使用默认参数 + 提供的属性)并将正确找到包含所有包含文件的输出文件。