"vendoring"是什么?你如何定义这个术语?
在不考虑具体实现的情况下,它在不同的编程语言中是否有相同的含义?
"vendoring"是什么?你如何定义这个术语?
在不考虑具体实现的情况下,它在不同的编程语言中是否有相同的含义?
如果你的应用程序依赖于某些第三方代码,则可以声明一个依赖项,并让你的构建系统为你安装该依赖项。
然而,如果第三方代码的源不是非常稳定,那么你可以"vendor"(买进)该代码。你将第三方代码添加到应用程序中,采用更或多或少隔离的方式。如果你认真进行这种隔离,你应该在你的组织/工作环境内“发布”这个代码。
另一个使用项目供应商代码的原因是,如果你想使用某些第三方代码,但想对其进行一些修改(换言之,进行分支),你可以复制代码,进行更改,在内部发布它,然后让你的构建系统安装此代码片段。
Vendoring 意味着将一个依赖项放入你的项目文件夹中 (与全局依赖相比) 并将其提交到仓库中。
例如,运行 cp /usr/local/bin/node ~/yourproject/vendor/node
并将其提交到仓库中,就可以 "vendor" Node.js 二进制文件 - 项目中的所有开发人员都将使用这个确切的版本。这在 node 自身中不常见,但是 Yarn 2 ("Berry") 就是这样使用的(也只能像这样使用;甚至不会将二进制文件安装到全局)。
提交操作很重要。例如,node_modules
已经安装在你的项目中,但是只有提交它们才能使它们成为 "vendored"。几乎没有人会这样做,但是 PnP + Yarn 2 的 Zero Installs 实际上是建立在 vendoring 周围的-您将带有许多 ZIP 文件的 .yarn/cache
提交到仓库中。
vendor (补丁和代码片段正在流传)。
err博客文章链接到早期使用相同约定的文章,例如this fairly minimal way to add vendor subdirectories to the Rails import path(2006年)。
早期从错误博客引用的文章,比如这篇(2005年),似乎使用了lib
目录,该目录没有区分自己的代码和未经修改的依赖项快照。
供应商目录的目标是更好地实现可重复性、更好的部署,以及人们目前使用容器的那种东西;以及通过源代码控制更好的透明度。
其他语言似乎已经采用了这个概念;一个相关的概念是锁文件,它以更紧凑的形式定义相同的依赖关系集合,涉及哈希和远程包存储库。锁文件可以用于重新创建供应商目录并检测任何更改。锁文件的概念可能来自Ruby gems社区,但请不要引用我。
我们想出的解决方案是将每个 Ruby 依赖项都放在“vendor”文件夹中。所有的依赖项,明白吗?这样每个人都在同一页上:我们不必担心谁有哪个 gem 的哪个版本(因为我们知道);我们也不必担心让每个人更新 gem(我们只需更新一次);我们也不必担心使用我们的库会破坏构建过程。 [...]
这里的目标很简单:始终使每个人,特别是您的生产环境,保持在同一页上。您不想猜测每个人是否拥有某些 gem。
还有一个微妙的点潜藏在背景中:一旦您的所有 gem 都受到版本控制,您可以轻松地在应用程序的任何阶段启动它而无需费心。您还可以很容易地看到您使用了哪些 gem 的哪些版本。真正的历史记录。
总结其他过于冗长的回答:
Vendor是将常常被分叉的依赖项的版本硬编码。
通常涉及静态链接或某些复制,但不一定必须这样做。
无论对错,“硬编码”这个术语都有一个旧的、不好的声誉。因此,在公开使用Vendor的项目中不会找到它,但我想不到更准确的术语了。