获取NuGet包的位置

5
在我的公司中,我们有一些自制工具在构建其他项目时用于构建过程。我需要在VS2017的BeforeBuild和AfterBuild脚本中使用这些工具,并且它必须在MS Build中也可以工作。
这些工具被分发为NuGet包,我们的大多数项目都已经移植到PackageReference而不是Packages.config。
我知道当前安装的MyTool(版本X.Y.Z)在C:\ Users \ Me \ .nuget \ packages \ MyTool \ X.Y.Z处,但是如何在我的项目文件中引用它,以便在下一个版本发布时它也能够工作呢?
我认为C:\ Users \ Me \ .nuget \ packages可以替换为$(NuGetPackageRoot),但是如何始终引用项目中安装的版本呢?
一些Nuget包似乎将贡献放入obj文件夹中的MyProject.csproj.nuget.g.props和MyProject.csproj.nuget.g.targets文件中,但是我几乎找不到关于这些文件的有用信息。
1个回答

6
在目标内,您可以使用此功能基于项创建属性:
<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="11.0.1" />
</ItemGroup>

<Target Name="PrintStuff" AfterTargets="AfterBuild">
  <PropertyGroup>
    <NewtonsoftJsonVersion Condition="'%(PackageReference.Identity)' == 'Newtonsoft.Json'">%(PackageReference.Version)</NewtonsoftJsonVersion>
    <NewtonsoftJsonPath>$(NuGetPackageRoot)newtonsoft.json\$(NewtonsoftJsonVersion)\</NewtonsoftJsonPath>
  </PropertyGroup>
  <Message Importance="high" Text="JSON.NET version: $(NewtonsoftJsonVersion)" />
  <Message Importance="high" Text="JSON.NET path: $(NewtonsoftJsonPath)" />
  <Exec Command="ls" WorkingDirectory="$(NewtonsoftJsonPath)" Condition="'$(OS)' != 'Windows_NT'" />
  <Exec Command="dir" WorkingDirectory="$(NewtonsoftJsonPath)" Condition="'$(OS)' == 'Windows_NT'" />
</Target>

谢谢!我已经苦苦思索了两天,试图找出如何将一些随 NuGet 包提供的文件复制到项目中的解决方案。 - Nelson Rodriguez
在VS 2017版本15.9 / CLI 2.1.500+中,将会有一种新的方式,但我会在公开发布后进行更新。 - Martin Ullrich
@MartinUllrich 你从来没有做过吗? - vivainio
1
我猜 https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#generatepathproperty 是现代的做法。 - Andrew McClement

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接