1

我有一个项目,其中包含三个针对各种 .net 版本(mylib.net20.csproj、、mylib.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 文件。

4

1 回答 1

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

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

nuget pack nuspecfilename.nuspec

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

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

现在让我们来满足您的要求,在您的 nuspec 文件中使用令牌 $version$。

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

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

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

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

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

有关如何从 csproj 创建 nuget 包的更多详细信息,请参阅此处。

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

因此,单个 nuspec 文件可能无法满足处理具有不同框架的多个项目文件的要求。您需要相应地拥有单独的 nuspec 才能实现这一目标。

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

我建议在运行时传递版本

nuget pack nameofnuspec.nuspec -v 1.3.4.5

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

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

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

于 2015-07-07T06:41:53.380 回答