如何为projectReference设置特定于构建的版本号,以便NuGet包依赖项列出正确的版本

时间:2017-10-31 17:39:00

标签: nuget visual-studio-2017 msbuild-15

在Visual Studio 2017中使用新的CSProj格式,我编写了一个目标文件来处理名为CreateLocalPackages的新配置,该配置具有在特定本地文件夹中创建NuGet包并使其自动递增版本号比该文件夹中任何解决方案包的最高编号高一个。

我的解决方案有几个项目,每个项目都构建一个NuGet包,其中一些项目依赖于解决方案中的其他项目。

例如,将这些文件放在本地包目录中:

BaseLibrary.2.1.0.1-betalocal.nupkg
BaseLibrary.2.1.0.1-betalocal.symbols.nupkg
BaseLibrary.Specialized.2.1.0.1-betalocal.nupkg
BaseLibrary.Specialized.2.1.0.1-betalocal.symbols.nupkg

下次将CreateLocalPackages配置构建为干净时,它会选择创建这些包:

BaseLibrary.2.1.0.2-betalocal.nupkg
BaseLibrary.2.1.0.2-betalocal.symbols.nupkg
BaseLibrary.Specialized.2.1.0.2-betalocal.nupkg
BaseLibrary.Specialized.2.1.0.2-betalocal.symbols.nupkg

我已经得到了很好的工作,除了Visual Studio似乎在我可以挂钩到MSBuild目标并将$(Version)更改为BaseLibrary\BaseLibrary.Specialized\obj\project.assets.json之前创建2.1.0.2文件的事实,导致{ {1}}只是引用此依赖项:BaseLibrary.Specialized.2.1.0.2-betalocal.nupkg。在调用MSBuild构建项目之前,Visual Studio似乎在NuGet还原步骤中生成BaseLibrary.2.1.0-betalocal

我已尝试运行我的版本号逻辑project.assets.json,以便在BeforeTargets="CollectPackageReferences;_ComputeTargetFrameworkItems"目标链的早期调用,但它似乎不像Visual Studio调用Restore为了恢复NuGet包引用(并生成MSBuild /t:Restore)。我不知道它是否有自己的逻辑,或者是否有其他工具。

我希望能够告诉VS重建并让它找出新版本,构建并打包所有内容,并列出正确的依赖版本。

1 个答案:

答案 0 :(得分:1)

  

如何为projectReference设置特定于构建的版本号,以便NuGet包依赖项列出正确的版本

如果我理解你是正确的,你需要在VS / MSBuild CreateLocalPackages目标之前调用版本号逻辑目标Restore

您可以通过以下MSBuild。* csproj文件中的代码段添加在目标还原之前运行的MSBuild目标或_GenerateRestoreProjectSpec

  <Target Name="VersionNumberLogicBeforeRestore"
          BeforeTargets="Restore">
    <Message Text="Version Number Logic Before Restore!" Importance="high" />
  </Target>

或者

  <Target Name="VersionNumberLogicBeforeRestore"
          BeforeTargets="_GenerateRestoreProjectSpec">
    <Message Text="Version Number Logic Before Restore!" Importance="high" />
  </Target>

但是,这只适用于不在Visual Studio中的dotnet cli。

dotnet restore "xx.csproj"

此外,NuGet恢复更改将是15.4的一部分,如果它仍然存在。否则15.5。

有关详细信息,请参阅Add support for pre restore MSBuild target that Visual Studio triggers

所以,此时,我们必须使用dotnet cli在Restore目标之前调用版本号逻辑目标,你也可以使用dotnet cli构建项目。