【问题标题】:How to set dynamic path to nuget references?如何设置nuget引用的动态路径?
【发布时间】:2018-04-26 19:30:57
【问题描述】:

这是示例项目结构:

{ 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 没有。错误表明它找不到明显位于包文件夹中的参考。

我的问题是,我如何编程/配置该句子(伪代码):

“尊敬的 ProejctB,请在与解决方案文件同级生成的包文件夹中查找引用。解决方案文件,正在尝试编译您。谢谢” em>

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

【问题讨论】:

  • 您是否检查了 Manage NuGet Package for Solution... 中每个包依赖项的项目 B 和 C?引用将自动设置。
  • @Jasen 我不确定我是否理解。当我单击 ProjectB 的 Manage NuGet Package for Solution... 时,我可以在已安装选项卡中看到带有“绿色检查”的包。它们被安装并放入解决方案所在的包文件夹中。只是,当我查看 Rereferences 列表时,它们会与黄色警告一起列出。项目生成了它,但看不到它们:/
  • @Jasen 当我将packages 文件夹(手动)粘贴到与ProjectB 文件夹相同的级别时(查看我编辑的问题),因此它与“潜在”解决方案文件处于同一级别对于 ProjectB(尽管那里没有 ProjectB.sln 文件)-它将编译。所以 -> ProjectB 在一个位置生成包,然后在另一个位置寻找引用 :///
  • 如果您在解决方案上调用该工具,包管理器会显示一个网格,其中包含解决方案下的所有项目 -- 每个项目都有一个复选框。有时在全新安装后,您需要执行还原包。但是参考设置是自动的。如果您遇到问题,您可能需要取消引用包并将其卸载,然后重新安装包。
  • 行不通。参考将,相同的包文件夹 - 将,nuget 下载 - 不。您需要将所有项目都放在同一级别。如果您想要不同的级别,则对于每个级别,您都需要解决方案。解决方案有.nuget\nuget.config。在那里,您可以设置&lt;config&gt; &lt;add key="repositoryPath" value="..\packages" /&gt; &lt;/config&gt;。您为每个级别添加`..\`。

标签: c# .net visual-studio nuget nuget-package-restore


【解决方案1】:

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

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

在 ProjectB 和 ProjectC 的 .csproj 文件中。它的字面意思是:“在与解决方案文件相同级别生成的包文件夹中查找引用。解决方案文件,它正在尝试编译你”

多次报告此问题。我相信它已修复here。还有NuGetReferenceHintPathRewrite,不过我没测试过。

【讨论】:

  • $(SolutionDir) 仅用于从 IDE 构建。
  • @UserName 我实际上只从 IDE 构建我的应用程序,所以它对我来说看起来不错,而且它有效!不过,我仍在探索我的选择
  • @Marshall 这是一个有趣的解决方案,但您需要记住,每次添加 nuget 包时都需要在 .proj 文件中进行手动操作。对于那些不在同一级别且 nuget.config 已设置(或默认)的项目
  • @T.S 是的,我知道这一点。但这个解决方案的好处是我没有“牺牲”任何东西。我认为默认路径&lt;HintPath&gt;..\packages\.. 实际上是&lt;HintPath&gt;$(SolutionDir)\packages\...。在我们切换到 VS2017 之前,我会接受这个答案。这并不理想(它是暂时的),但这是我一直在寻找的
【解决方案2】:

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

在 VS 2017 版本 15.7 中,引用节点的上下文菜单中将有一个迁移选项(已在预览版中提供):

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

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

【讨论】:

  • 我们仍在使用 VS2015,$(SolutionDir) 解决方案可能是目前最适合我们的解决方案。亲吻,对吧?当我切换到 VS2017 时,我会回到这个答案。谢谢强硬
  • 是的 $(SolutionDir) 仅在构建解决方案时有效,因此如果您希望 msbuild my.csproj 正常工作,您可能需要使用后备更新项目文件。 (在 VS 2017 中使用 Directory.Build.props 再次为所有项目默认设置更容易)
  • 感谢@Martin,非常感谢您的帮助。我将继续使用“解决方案”解决方案,因为我们没有很多这样的项目,所以我们已经修复了它们。目前,这很好。我们将在未来看到(我知道这可能是临时解决方案)。
  • 完全没有问题,请在以后的问题中包含 VS 版本。
【解决方案3】:

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)

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

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

  1. “包配置”
  2. “ProjectB.csproj”
  3. msbuild编译日志,知道你在哪个包 面临问题。

【讨论】:

  • 您的回答没有解决同一解决方案中项目文件夹级别的问题
  • 请提供“package config”、“ProjectB.csproj”和编译日志
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多