【问题标题】:How to use variables in nuget.config repositoryPath and csproj Reference HintPath如何在 nuget.config repositoryPath 和 csproj Reference HintPath 中使用变量
【发布时间】:2019-01-14 10:06:36
【问题描述】:

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

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

我正在尝试找出一种合理的方法来防止提示路径中断。

我的一个想法是使用环境变量指向共享包文件夹(类似于 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 文件?

【问题讨论】:

  • 如果您使用 packages.config 文件,NuGet 始终使用相对路径进行引用。如果您不想要提示路径,您可以改为使用 PackageReferences - 这些不包括项目中的提示路径。对于使用 packages.config 文件的项目,您唯一可以做的就是将 NuGet.Config 放在所有解决方案的某个父目录中,然后在此处定义所有解决方案都将使用的路径。

标签: visual-studio msbuild nuget


【解决方案1】:

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

就像 Matt 所说,“如果您使用 packages.config 文件,NuGet 总是使用相对路径进行引用。”。而且,AFAIK,nuget.config(或其他什么?)中没有这样的配置来使提示路径使用$(USERPROFILE)\.nuget\shared_packages 的文字值。

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

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

然后你可以将你的包添加到你的项目中,所有的包都存储在C:\Users\&lt;UserName&gt;\.nuget\packages中。

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

希望这会有所帮助。

【讨论】:

  • 不幸的是,当使用多宿主项目的大多数客户端应用程序是 ASP.NET 项目时,这不起作用。由于某种原因,您在这里不支持 PackageReference。例如,要求 packages.config 实现使用 NUGET_PACKAGES 环境变量真的太过分了吗?
  • 或者更好的是,只需使用 PackageReference 使用的默认 globalPackagesFolder,这样它就可以正常工作,而无需在干净的开发人员系统上执行任何操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多