如何在nuget.config repositoryPath和csproj参考HintPath中使用变量

时间:2019-01-11 22:17:52

标签: visual-studio msbuild nuget

由于我们使用Multi-Homed Projects,我的公司遇到了NuGet软件包引用问题:

  

在多个解决方案中包含一个项目是很常见的。不幸的是,NuGet无法理解这种情况。而且由于NuGet在解决方案级别使用packages文件夹,因此项目中的“提示路径”变得与解决方案相关。如果一个项目有多个解决方案,这些相对路径很容易中断。

我正在尝试找到一种合理的方法来防止提示路径被破坏。

我曾经的一个想法是使用环境变量指向共享的程序包文件夹(类似于NuGet在.NET Core项目中的工作方式)。

我试图创建一个nuget.config,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>  
  <config>
    <add key="repositoryPath" value="%USERPROFILE%\.nuget\shared_packages" />
  </config>
</configuration>

当我安装软件包时,它会生成带有相对路径的提示路径:

<Reference Include="QRCoder, Version=1.3.5.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>..\..\..\..\Users\Username\.nuget\shared_packages\QRCoder.1.3.5\lib\net40\QRCoder.dll</HintPath>
</Reference>

这在其他计算机上将不起作用,因此我必须手动将.csproj文件编辑为以下内容:

<Reference Include="QRCoder, Version=1.3.5.0, Culture=neutral, processorArchitecture=MSIL">
    <HintPath>$(USERPROFILE)\.nuget\shared_packages\QRCoder.1.3.5\lib\net40\QRCoder.dll</HintPath>
</Reference>

我是否可以配置nuget.config(或其他方式?)使提示路径使用$(USERPROFILE)\.nuget\shared_packages的字面值,所以我不必每次都手动编辑.csproj文件?

1 个答案:

答案 0 :(得分:1)

  

如何在nuget.config repositoryPath和csproj参考HintPath中使用变量

就像Matt所说的那样,“ NuGet始终使用相对路径作为参考,如果您使用的是packages.config文件。”。而且,AFAIK在nuget.config(或其他内容?)中没有这样的configure可以使“提示路径”使用$(USERPROFILE)\.nuget\shared_packages的文字值。

要解决此问题,可以在项目文件中使用程序包引用(PackageReference)而不是packages.config。使用PackageReference,即使您使用的是.NET框架,您的程序包也会指向共享程序包文件夹(类似于NuGet对.NET Core项目的处理方式)。

要使用PackageReference,请转到“工具”->“ NuGet PackageManager”->“包管理设置”:

enter image description here

然后,您可以将包添加到项目中,所有包都存储在C:\Users\<UserName>\.nuget\packages中。

此外,您可以Migrate from packages.config to PackageReference进行那些使用packages.config安装软件包的项目。

希望这会有所帮助。