OctoPack 未在 nuspec 文件中填充占位符

Posted

技术标签:

【中文标题】OctoPack 未在 nuspec 文件中填充占位符【英文标题】:OctoPack not populating placeholders in nuspec file 【发布时间】:2018-03-07 14:49:17 【问题描述】:

我有一个包含许多项目的解决方案,其中大约有十几个项目安装了 Octopack,并且当 TeamCity 运行 msbuild /p:RunOctoPack=true /p:OctoPackEnforceAddingFiles=true 时,软件包正在正确生成。您可能从p:/OctoPackEnforceAddingFiles 标志中可以看出,每个安装了 Octopack 的项目也都有一个 nuspec 文件。

我们遇到的问题是 Octopack 不遵守https://docs.microsoft.com/en-gb/nuget/reference/nuspec#replacement-tokens 指定的 nuspec 占位符。我们现在要使用的是$id$,它应该等于正在打包的项目的程序集名称。相反,当我们运行 Octpack 时,$id$ 令牌是空的。

我可以在 https://octopus.com/docs/packaging-applications/creating-packages/nuget-packages/using-octopack#UsingOctoPack-Replacementtokens 看到 Octopack 允许手动覆盖这些令牌,但这对我没有帮助,因为 Octopack 在解决方案上运行,但是我需要正在打包的项目的名称。

我可以做些什么来解决这个问题?目前,我们基本上将项目名称硬编码在 nuspec 文件中,但这变得脆弱和笨拙,我们想修复它。

【问题讨论】:

【参考方案1】:

我通过将以下内容添加到 csproj 文件来实现此功能

  <PropertyGroup>
      <OctoPackNuGetProperties>id=$(AssemblyName)</OctoPackNuGetProperties>
  </PropertyGroup>

这会将程序集名称作为 id 传递给 Octo.exe,Octo.exe 又将通过其 -Properties 参数将其传递给 NuGet.exe。

【讨论】:

【参考方案2】:

您是否尝试过在 NuSpec 中完全不提供 $id$ 部分? Octopack 应该尝试生成它(它知道what it is being applied to)?

替代方法是使用带有$(ProjectName) 宏的预构建事件来更新相关的nuspecs。在您的情况下,根据您的构建过程,可能会坚持解决方案范围的预构建过程来更新所有 nuspec。

附:我个人不再使用 Octopack,目前使用 Fake (F# Make)。

【讨论】:

感谢您的回答@Alex M。我对 Fake 有点熟悉,但我很好奇它如何取代 Octopack?据我现在可以想象,即使我们在构建过程中使用 Fake,Fake 管道在某些时候仍会调用 Octopack。 请注意,我并不主张您停止使用 Octopack,因为它可能需要一些设置工作,但基本上 octopack 只是 nuget.exe 的一个包装器。如果您摆脱它,那么您需要做的就是手动打包所需的文件,其中Fake 更接近原生方法。

以上是关于OctoPack 未在 nuspec 文件中填充占位符的主要内容,如果未能解决你的问题,请参考以下文章

如何在octopack中使用nuspec中设置的版本号?

指定 Octopack nuget 包文件的目标路径

octopack nuget 包版本

OctoPack 和 OD 通道:如何创建可以通过管道传输到版本通道的包版本?

引用的库使用 VS 2017 在 Nuspec 中注册为其他 nuget 引用

如何从通过 Jenkins 使用 Octopack 构建的 NuGet 包中排除目录和文件?