msbuild v15无法解析nuspec文件的元数据变量

时间:2018-10-18 19:53:35

标签: c# msbuild nuget nuspec dotnet-sdk

我知道自从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
  

.NET Framework的Microsoft(R)Build Engine版本15.8.168 + ga8fba1ebd7   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可以使用包的元数据变量来支持吗?

1 个答案:

答案 0 :(得分:7)

正如评论中提到的那样,您不再需要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>