【问题标题】:Force compiler to use references from installed NuGet packages only instead of local DDLs强制编译器仅使用已安装 NuGet 包中的引用而不是本地 DDL
【发布时间】:2021-08-01 15:16:07
【问题描述】:

是否可以告诉编译器不加载本地安装的 DLL 并仅使用已安装的 NuGet 包提供的引用?

在我们的开发人员机器上,安装了各种框架,但我们的 CI 环境中缺少这些框架。这通常会导致构建失败并且修复起来非常烦人。

例如,我的项目中的一个引用 Microsoft.Office.Interop.Word 在本地工作,因为我的机器上安装了办公套件。一旦我在 CI 中运行构建,构建就会失败,因为我们的代理上没有安装 office-suite。

更新

我的问题的根源如下。我有一些以前没有使用 NuGet-Packages 的旧软件。在本地,我可以毫无问题地构建这些项目。但是一旦我触发 CI 构建,构建就会失败,因为代理上没有安装一些引用。然后我必须搜索可以替换本地引用的 NuGet 包并将更改推送到我们的 git 存储库。

我想跳过这个耗时的更改引用的任务,然后推送并等待构建完成。如果可以选择告诉编译器不使用本地引用,我会在本地机器上遇到同样的错误。

【问题讨论】:

  • 你能举个例子说明你所说的那种参考是失败的吗?通常,如果您想告诉编译器使用 nuget 包,只需在 csproj 中使用 <PackageReference> 即可;如果您使用其他类型的参考:它们是什么?
  • @MarcGravell 我添加了一个示例。这个问题大多只发生在我们产品组合中的旧应用程序中,因为新项目仅使用 NuGet 包构建
  • @mamen 将 Interop.Word 库导入 .csproj 文件的 xml 元素是什么样的?
  • 根据规模,您可以删除对程序集的引用,然后安装 NuGet 包。
  • 还有,为什么要一次性将它们全部替换为 NuGet 包。我知道这很痛苦,但这不是你以后需要再做的事情。

标签: c# visual-studio nuget roslyn


【解决方案1】:

我有一些以前没有使用 NuGet-Packages 的旧软件。在本地,我可以毫无问题地构建这些项目。但是一旦我触发 CI 构建,构建就会失败,因为代理上没有安装一些引用。

您的项目将从 GAC 或通过 COM 引用程序集。

您希望禁止引用其中任何一个(作为目标框架的一部分提供的核心程序集除外)。

为此,请在所有项目文件(即.csproj 文件)中搜索<Reference><COMReference> 类型的任何项目。任何引用非框架程序集的都应删除并转换为<PackageReference>

“框架组装”是指System.Windows.Forms 等。 .NET 附带的东西。确切的设置取决于您所针对的目标框架。我猜这是 .NET Framework 的某个版本。如果是这样,也许现在留下任何与System.* 匹配的<Reference> 项目。

如果<Reference>HintPath,这是一个很好的迹象,表明它也在本地从您的机器中提取,应该进行转换。

【讨论】:

  • 谢谢,这对我来说似乎是最好的选择。
  • 很高兴听到这听起来很有希望。你过得怎么样?
  • 我打开了所有.csproj 文件并列出了我需要替换的引用。然后我将它们全部替换为 NuGet 包。对于我需要集成到我们的 CI/CD 系统中的下一个遗留项目,我将从一开始就这样做。
猜你喜欢
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
  • 2021-12-29
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多