有没有办法强制所有依赖项都来自 .net 项目的在线资源 installed/restored?

Is there a way to force all dependencies to be installed/restored from online sources for .net projects?

我们有许多使用 DevExpress XAF 框架的项目的解决方案。其中许多项目都使用 DevExpress 的包。很多时候出了问题,引用被破坏了。有没有办法强制所有项目都使用远程在线资源?我的目标是作曲家 / npm / .. 等经验。

我们也可以强制使用非 nuget.org 回购吗,因为 devexpress 有它自己的回购?它目前列在解决方案根目录的 nuget.config 中。对我来说,微软文档没有提供答案。

当包出现在包文件夹中时,我并不完全清楚。何时声明出现在 .csproj 中或何时出现在 packages.config 中。一个更统一和集中的地方来跟踪包裹会很棒。

有人可以解释一下他们在项目中是如何做到的以及为什么吗?

编辑: 我们使用 git,而不是 TFS。此外,我不希望在版本控制中存储二进制文件(dll)。我添加了这个,因为很多人建议将其作为一个选项。

我个人发现最好有一个主目录来包含我的所有 NuGet 包,并且让我的所有解决方案和项目都引用该目录。

您可以通过修改您的 %AppData%\Roaming\NuGet.config XML 文件以包含以下元素来手动设置 NuGet 安装其包的默认位置:

<config>
  <add key="repositoryPath" value="C:\NuGetPackages" />
</config>

用您选择的任何值替换我的值。现在,这不会更改现有项目的 NuGet 包位置,因此不幸的是,您将不得不经历删除这些引用的痛苦,然后再次通过 NuGet 界面使用新的默认 download/install 位置。但是,完成所有这些后,它确实简化了 NuGet 包的过程和维护。它还会阻止您在五个不同的解决方案子目录中拥有同一个 NuGet 包的五个版本。

而且,如果您想确保可以恢复它们的任何版本,您可以随时将它们添加到 Team Foundation Server 中(如果您使用 TFS,就是这样)。

开发者本地环境

在管理具有多个依赖项的大型解决方案时,包括 nuget、第 3 方 dll (DevExpress) 等...确保使用任何解决方案是关键依赖开发人员的本地目录结构。

例如,如果解决方案总是寻求从以下位置恢复/查找/复制一些依赖项:

D:\org-name\dependencies\third-party-1\

在这种情况下,当开发人员没有“D”驱动器时,您将 运行 遇到问题。这可能不是您的惯例,但重点是不要将依赖项解析锁定到硬编码目录。

第三方依赖项

我理解 不希望 将 dll 存储在您的 git 存储库中的愿望。但是,当涉及到第 3 方程序集时,依靠他们公司的 nuget feed1 或其他一些外部 URL 最终会在他们的服务器上咬你一口**离线,或者您的互联网已离线。或者更糟糕的是,他们的服务停业了。

1 这是第 3 方 nuget 提要。不是官方 nuget/ms 供稿。

确保项目的第 3 方程序集可以恢复的最可靠方法是将它们包含在您的存储库中。

我们使用的策略是在解决方案的根目录中包含一个文件夹,其中包含来自第 3 方的程序集的当前版本。然后在项目中引用那些程序集; 不是来自他们公司的 nuget 提要(或类似提要)。

例子

\Solution Root
  \Binaries (or name it whatever you want)
    \DevExpress
      - DevExpress.Utils.v16.1.dll
      - DevExpress.Utils.v16.1.xml
      - etc..
    \Another-Third-Party
      - foo.dll
      - foo.xml
      - etc...
  \ProjectA
    - ProjectA.csproj
  \ ProjectB
    - {you get the idea...}
  - .gitignore
  - your-solution.sln

此策略的优点在于,您将始终拥有当前版本的解决方案中引用的 dll 的确切版本。永远不需要从外部服务器获取它们。

提醒一句:如果您的开发人员之一通过他们的安装程序或 DevExpress nuget 提要添加另一个 DevExpress 程序集,则此策略可能会适得其反。所以你的团队必须明白所有 DevExpress 程序集都是 always 从你的 \Solution Root\Binaries\DevExpress 目录引用的。当你的构建服务器崩溃时你会知道有一个不正确的引用(永远不要在你的构建服务器上安装 DevExpress 废话!)

Nuget 依赖项

Nuget 程序集不需要存储在您的存储库中,因为它们保证始终可用于您引用的版本。

但是,我建议您始终将引用的 nuget 依赖项添加到每个版本的存储库中。这将确保无论发生什么情况,您都可以随时使用它们。

packages.configproject.csproj nuget 包引用而言,您需要逐案处理这些引用,回复:非常古老的 nuget 约定是一个packages.config。当前的约定是在 .csproj 文件中引用 nuget 包。我建议的是从 packages.config 中提取引用并将它们拉入您的 .csproj 文件中。这可能有点耗时,但您最终会在解决方案中的所有项目中采用通用约定。

NPM

NPM 是包管理器。 Nuget 是一个包管理器。也不会打包商业购买的包裹;它们几乎总是通过手动过程或需要授权的公司 nuget 提要添加。

换句话说,当您处理从 DevExpress 商业购买的依赖项时,您将不得不使用他们的私有 nuget 提要,或者使用类似于我上面概述的策略。

总结

虽然没有提及,但您可以提供自己的私有 nuget 服务器,它维护所有第 3 方依赖项。但是,保持更新是一个 PITA。我上面概述的策略非常有效并且非常容易维护。

希望这能让您朝着好的方向前进。