如何设置 nuget 引用的动态路径?

How to set dynamic path to nuget references?

示例项目结构如下:

{ ProjectA }
    { packages } <-- packages are created here
    { ProjectA }
        - ProjectA.csproj <-- references ProjectB and C.
        - packages.config
    - ProjectA.sln <-- contains all projects: A, B and C.

{ ProjectB }
    - ProjectB.csproj
    - packages.config

{ ProjectC }
    - ProjectC.csproj
    - packages.config   

*{ packages} <-- *When I manually paste packages here. So one level above ProjectB.csproj file, then ProjectB compiles.

ProjectA 解决方案包含所有三个项目:A、B 和 C。ProjectA 引用 ProjectB 和 ProjectC。

当我编译 ProjectA(同时编译项目 B 和 C)时,所有 nuget 包都下载到与解决方案文件同一级别的 {packages} 文件夹中。问题是 ProjectB 没有编译。是的...只有 ProejctB。我什至不会去研究为什么只有一个项目可以编译,尽管它们的配置完全相同。无论如何...

在 ProjectB 和 C 中,当我展开来自 nuget 的引用 dll 时,可以看到它们丢失了(带有黄色矩形)。 ProjectC 无论如何都会编译,但 ProjectB 不会。错误说它找不到明显在包文件夹中的引用。

我的问题是,我如何program/configure那句话(伪代码):

"Dear ProejctB, Please look for the references in the package folder generated on the same level as the solution file. The solution file, which is trying to compile you right now. Thank you"

PS。所以从技术上讲,dll(参考)的路径将是动态的。它会根据哪个解决方案文件是 opening/compiling 项目而改变。可能吗?

最简单的修复方法是将 HintPath 设置为:

<HintPath>$(SolutionDir)\packages\...

在 ProjectB 和 ProjectC 的 .csproj 个文件中。字面意思是:"look for the references in the package folder generated on the same level as the solution file. The solution file, which is trying to compile you right now"

此问题已报告多次。我相信它已修复 here. There is also NuGetReferenceHintPathRewrite,但我没有测试它。

由于 packages.config 逐渐被弃用,您可以将项目从 packages.config 迁移到 ProjectReference,其中 NuGet 包在 csproj 文件中指定,共享的全局位置是用于存储包(并且没有任何需要更改的 HintPath 引用)。

在VS 2017 15.7版本中,在引用节点的上下文菜单中会有迁移的选项(预览中已经可用):

PackageReference VS 2017 已经支持 15.1 或 15.2 左右,只有迁移工具处于预览状态。

对于新项目,VS 2017(当前版本!)您已经可以 select 默认包引用样式并允许为新项目选择它:

Nuget 3.x 有 packages.config 概念,在此包名称和版本中有 2 个地方提到(在 package.config 和 .csproj 文件中)

包配置中的引用应该是这样的:

<package id="NewtonsoftJson" version="9.0.1" targetFramework="net46" />

csproj 中的提示路径应该是这样的:

<HintPath>..\packages\NewtonsoftJson.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>

此处“..\packages”表示向上一级(意味着在解决方案级别)并查找 "packages" 文件夹。

您应该验证提示路径是否存在。两个文件(package.config 和 .csproj)中的包版本应该相同 (9.0.1)

由于您的 Project C 编译成功,似乎只有 ProjectB 使用的包中存在一些问题。

如果您仍然遇到问题,请提供以下详细信息以供进一步分析。

  1. "package config"
  2. "ProjectB.csproj"
  3. msbuild编译日志,知道你在哪个包 正面临问题。