8

我知道自从 msbuild 15(与 2017 年相比)发布以来,NuGet 现在已完全集成到 MSBuild 中。

我有一个 nuspec 文件,其中定义了包属性的变量,例如:

    <metadata>
        <id>$id$</id>
        <version>$version$</version>  
        <authors>$authors$</authors>
    ...
    </metadata> 

nuspec 文件位于项目的同一文件夹中。

使用 nuget 工具创建包时,它工作正常。

    nuget pack   

使用 msbuild v15 时,它会引发异常。

运行命令:

    msbuild -version

Microsoft (R) Build Engine 版本 15.8.168+ga8fba1ebd7 用于 .NET Framework 15.8.168.64424

    msbuild  /t:pack /p:configuration=release    /p:NuspecFile=mylib.nuspec

引发异常:

C:\Program Files\dotnet\sdk\2.1.402\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(199,5):错误:值不能为空或为空细绳。

奇怪的是 dotnet sdk 版本 2.1.402 引发了异常。

我尝试使用 vs2017 安装 msbuild 及其路径,它也引发了相同的异常。

当我用它的值替换变量时,msbuild 工作正常。

问题

这是 msbuild 版本 15.8.168.64424 中的错误还是我错过了什么?

换句话说,msbuild 是否支持使用包的元数据变量?

4

1 回答 1

12

正如评论中提到的,您不再需要 Nuspec 文件,因为大多数方面都可以通过 csproj 文件中的属性或项目的其他元数据(例如,如果您需要其他内容)来控制。

如果出于某种原因确实需要 nuspec 文件,则需要自己提供用于替换的变量。您可以在 csproj 文件中的目标中执行此操作,如下所示:

<Target Name="SetNuspecProperties" BeforeTargets="GenerateNuspec">
  <PropertyGroup>
    <NuspecProperties>$(NuspecProperties);id=$(AssemblyName)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);config=$(Configuration)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);version=$(PackageVersion)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);description=$(Description)</NuspecProperties>
    <NuspecProperties>$(NuspecProperties);authors=$(Authors)</NuspecProperties>
  </PropertyGroup>
</Target>
于 2018-10-20T08:11:20.197 回答