定位多个项目文件时如何同步 nuget 包的版本号

How to sync version numbers for nuget packages when targeting multiple project files

我有一个项目,其中包含三个针对各种 .net 版本的项目文件(mylib.net20.csprojmylib.net40.csprojmylib.net40-client.csproj)。我有一个名为 mylib.nuspec 的 nuspec 文件,用于将它们打包在一起。

查看 nuspec 文件的文件部分可能会有所帮助,所以这里是:

<files>
    <file src="bin\net20\*.dll" target="lib\net20\" />
    <file src="bin\net40-client\*.dll" target="lib\net40-client\" />
    <file src="bin\net40\*.dll" target="lib\net40\" />
</files>

现在我在 nuspec 文件中使用静态版本号,我可以通过 运行 nuget pack mylib.nuspec 成功打包所有内容。但是,我想开始使用 $version$ 这样我就不用记得在两个地方更新版本号了。

如果我只是将版本号更改为 $version$,并以相同的方式构建,我会得到可预测的错误:

Attempting to build package from 'mylib.nuspec'.
The replacement token 'version' has no value.

如果我使用 $version$ 并用 nuget pack mylib.net40.csproj 打包,它是成功的,但我得到一个完全忽略 nuspec 文件的包。

问:我该怎么做才能使 $version$ 变量起作用?

从技术上讲,我可以将我的 nuspec 文件重命名为 mylib.net20.nuspec,然后用 nuget pack mylib.net20.nuspec 打包。不过,我真的不想以这种方式重命名我的 nuspec 文件。

creating a package can be done two ways
  1. 直接使用 nuspec
  2. 使用您的 csproj 文件,实际上它在 运行 时使用您的 nuspec 文件。

第一种情况非常简单,在创建包时将考虑在 nuspec 文件中定义的所有元数据。

nuget pack nuspecfilename.nuspec

执行上述命令后,您的 nuspec 文件中的所有硬编码值都将用于包创建

以上程序直接使用 nuspec 文件。

现在满足您的要求,在您的 nuspec 文件中使用标记 $version$。

为了使用标记而不是硬编码值,我们需要在 运行ning nuget pack 命令时使用 csproj 文件。

nuget pack nameofyourprojectfile.csproj -p "configuration=Release;platform=x64"

我将解释我使用的命令,在生成包时使用 csproj 文件的概念是它将在 运行 时替换 nuspec 文件中的所有标记。

您的 csproj 文件对应的程序集信息文件将包含所需的版本元数据,该元数据将在 运行 时被替换。

-p 是在 运行 时间使用的参数,这里我假设我的 proj 文件是在发行版和 x64 平台上构建的,所以我在 运行 时间传递了它,所以 nuget 用于要相应捆绑的工件。

请参阅 Here 了解有关如何从 csproj 创建 nuget 包的更多详细信息。

但理想情况下,当您从 csproj 文件打包时,您的 nuspec 文件将在 运行 时使用,因此从技术上讲,nuspec 文件应与您的 csproj 文件同名。

因此使用单个 nuspec 文件可能无法实现处理具有不同框架的多个项目文件的要求。你需要有相应的 nuspec 来实现这个。

但是如果您仍然想坚持使用相同的 nuspec 文件而不对其进行重命名或更改。

我建议在 运行 时间通过版本

nuget pack nameofnuspec.nuspec -v 1.3.4.5

-v - 是版本,或者您也可以使用 -version 以及您选择的版本。

在 运行ning 上面的命令之后,将使用指定的版本创建 nuget 包。

检查创建的 nuget 包,将其重命名为 .zip 文件并检查...)