【问题标题】:"Nuget pack" seems to ignore BasePath parameter“Nuget pack”似乎忽略了 BasePath 参数
【发布时间】:2015-06-21 16:20:02
【问题描述】:

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

构建包:
"D:\BUILD\Sources\SOLUTION\.nuget\NuGet.exe" 包 "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" 尝试从“PROJECT.csproj”构建包。

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

然后我将-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 构建使用的相同“相对路径”,它就可以工作...
但这不可能是解决方案,对吧?

【问题讨论】:

    标签: tfs msbuild nuget tfsbuild nuget-package


    【解决方案1】:

    在我自己的 TFS 构建中,我遇到了与您完全相同的问题。问题是,当使用csproj 文件调用NuGet pack 时,它实际上将csproj 评估为MSBUILD 文件,并且默认的OutDir MSBUILD 属性设置为{ProjectDir}\bin\{ConfigurationName}

    但对于 TFS 构建,输出目录通常设置为暂存位置,例如 BUILD/Binaries/Release

    您缺少的是 OutDir 属性到 NuGet pack,这是一个适合您的示例:

    &lt;BuildCommand&gt;$(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform);OutDir=$(OutDir)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols -NoPackageAnalysis -BasePath "$(TargetDir)"&lt;/BuildCommand&gt;

    有了这个额外的OutDir 属性,NuGet 应该能够找到您新建的二进制文件并将它们添加到包中。

    【讨论】:

    • 感谢您的输入,但这个“项目”现在在这里“暂停”,因为它目前正在使用解决方法,并且支持 TFS 2015 此类操作(NuGet 打包和推送)原生,所以我们不会再花时间在“手动”上;-)...
    • 来自nuget.codeplex.com/workitem/1486:OutDir 必须以反斜杠 \ 结尾(在 Windows 上)。当 OutDir 包含空格时,它必须被引用,但是命令行解析中还有另一个错误/功能 - 引号之前的反斜杠必须加倍。完整的解决方法是 -Properties OutDir="$(OutDir.Trim('\\'))\\"
    • 这对我有用。我必须在 $(TargetDir) 之后添加一个空格: $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform);OutDir=$(OutDir. Trim('\\'))\\" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols -BasePath "$(TargetDir) "
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 无用:使用 -Build 会导致 nuget.exe 创建新的输出文件,而不是查找由 TFS 构建代理创建的输出文件。多次构建绝不是一个好主意,但更重要的是:NuGet.exe 不会传递与 TFS 构建代理相同的 MSBuild 参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2021-10-28
    • 2016-09-30
    • 2016-03-16
    相关资源
    最近更新 更多