Yarn: 在纱线安装中允许 git repos 中的子目录

创建于 2017-10-17  ·  40评论  ·  资料来源: yarnpkg/yarn

您要请求功能还是报告错误
特征

目前的行为是什么?
无法安装 git repos 子目录中的包。 这是 monorepos 的一种非常常见的情况,并且只是在根 repo 中不能包含 node 包的存储库。

如果当前行为是错误,请提供重现步骤。
不是但是

什么是预期行为?
yarn addyarn global add应该有一个可用的语法,允许添加位于 git repo 子目录内的包。

在测试未发布版本的问题/回归或修复时,使用未发布的代码变得更加容易,比如这张票https://github.com/Microsoft/code-push/issues/428

前任。 受此问题影响的软件包
https://github.com/Microsoft/code-push/tree/master/cli
https://github.com/Microsoft/BotBuilder/tree/master/Node
https://github.com/facebook/react-native/tree/master/react-native-cli
https://github.com/babel/babel/tree/master/packages/babel-cli

相关 npm 问题: https :

请提及您的 node.js、yarn 和操作系统版本。
纱线版本 v1.2.1
节点版本 v8.7.0
macOS Sierra 10.12.6

最有用的评论

我搭建了一个服务https://gitpkg.now.sh/ ,将一个git repo的子文件夹下载为.tgz文件,这样可以通过yarn和npm安装。 有了这个服务,包用户可以直接使用子目录,不需要包开发者发布子目录。

例如,如果你想在分支next-8-dev添加
只需使用:

yarn add https://gitpkg.now.sh/babel/babel/packages/babel-core?next-8-dev

也适用于npm install

请注意,我必须向@ramasilveyra说声抱歉,因为我的服务名称与他开发的工具冲突,但我之前并不知道。

所有40条评论

使用语法指定链接问题中的子目录有几个好主意 (npm/npm#2974)

使用pip的方式使用查询参数
git+https://git.repo/some_repo.git?subdirectory=subdir_path#branch
或者
git+https://git.repo/some_repo.git#branch?path=subdir_path
虽然我认为大多数 url 解析器不会解析这个。

使用::因为它不是分支名称的有效标记
git+https://git.repo/some_repo.git#branch::subdir_path
git+https://git.repo/some_repo.git#::subdir_path

另一个想法: git+https://git.repo/some_repo.git/subdir_path#branch 。 如果我假设存在此功能,这就是我首先要尝试的。 其他选项需要有人查找语法。

这可能不明确,具体取决于 git 服务器 url 的设置方式。

网址可能类似于

git+https://github.com/yarnpkg/yarn/<subdir_path>#branch

然后就很难说什么是 repo 路径的一部分,什么是 subdir_path

不确定这是否适用于每个 repo,但在 Github 上git+https://github.com/yarnpkg/yarngit+https://github.com/yarnpkg/yarn.git工作。 您可以假设.git/是子目录之后的任何内容。

不管语法如何,无论哪种方式都有这个功能都会很好。 不过让语法变得直观会很酷:)。

哦,是的,我主要是在谈论其他网站,而不是真正的 github。 抱歉,我的例子不是最好的解释。

关于在 npm 中支持这一点的长时间讨论:
https://github.com/npm/npm/issues/2974

线程中有一些建议的分隔符。

我也希望能够这样做以促进使用包含许多子模块的 monorepo。 我还找到了讨论这个的 #1570。 这是关闭支持https://github.com/yarnpkg/rfcs/issues/15https://github.com/yarnpkg/rfcs/issues/15不再存在所以很难说如果有的话在那里完成或决定。

所以yarn还不支持吗?
好吧,没有比发布和使用 npm 包更简单的选择了:(

是的,monorepo 架构的日益流行使其成为一个关键特性。 现在有什么解决方法吗? 关于公共 API 的讨论往往会持续数年之久……

我的 #1 用例是从尚未合并或发布的 monorepo 中提取错误修复。 我经常想保留大部分原始软件包,但通过错误修复来引入其中一个子存储库。 目前我无法做到这一点,而且解决方法很复杂。 能够引用 Github 分支将大大降低阻力。

我知道 npm 有一些人对这个想法非常抗拒,一般来说是 monorepos。 然而,这里的许多贡献者都致力于使用 monorepos 的项目。 我怀疑如果 yarn 实现了这个功能并且它变得足够流行,npm 会效仿。 很多 yarn 的想法后来都在 npm 中实现了。 纱线对我来说是 npm 的 babel。

我能想到的@erykpiast几种解决方法:

  1. 在某处克隆目标仓库,然后使用yarn add /path/to/repo/subdirectory
  2. 或者可能(如果它在你自己的 monorepo 中)使用纱线工作区

或者——这可能更疯狂——将有问题的遥控器添加为子模块并(可选地将您的项目文件移动到子目录中)_然后_使用纱线工作区?

免责声明:我没有尝试过这两种方法中的任何一种,它们都为新开发人员和您的 CI 构建增加了开销......

或者——这可能更疯狂——将有问题的遥控器添加为子模块,然后(可选地将您的项目文件移动到子目录中)然后使用纱线工作区?

我可以确认这有效。

升级到 webpack 4。 Create React App 尚不支持,但有一个 PR 正在等待合并 - 不幸的是 webpack 4 已经改变了它的插件 API。 双重不幸:create-react-app 是包含多个包的存储库。 添加分叉 PR 作为子模块并使用“文件:”语法添加包很有魅力。

通过这项工作,从字面上节省了一整天或更多的工作。

令人担忧的是,由于 monorepos 的普及,这不在 npm 或 yarn 的路线图上。 git+...语法使对单包项目的贡献变得轻而易举,相比之下,子目录没有它使得对 monorepo 项目的贡献令人头疼。

我同意。 在 git 子模块file:路由几个月后,它并不理想。 加入其他开发人员更加困难。 我的同事不得不担心初始化和更新子模块。 在他们的辩护中,过去只需运行yarn即可让自己前进。

Monorepo 支持将是梦想成真。

yarn + lerna(使用 yarn 的工作区)用于管理 monorepos。

从 monorepo 安装的第二个工具并不理想。 它应该是
简单到从单个包 repo 安装包,使用yarn add ...

一般来说,它对 JS 的“小问题”没有帮助。 出现了一个用例。 我们
当现有工具是完美的家时,使用新工具。

2018 年 7 月 1 日星期日晚上 11:34 Frederik Krautwald, notifications @github.com
写道:

yarn + lerna(使用 yarn 的工作区)用于管理 monorepos。


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/yarnpkg/yarn/issues/4725#issuecomment-401638034或静音
线程
https://github.com/notifications/unsubscribe-auth/AAjP2lWrm2u8tOiIZQ5D-oKre9BqTj5-ks5uCU6SgaJpZM4P7hjl
.

@Frikki我不相信 lerna 有很多子模块支持,无论如何都不是“消费工具”。

@jwdunne现在我只是npm publish一个命名空间版本的 fork 并依赖它

你好! 我构建了https://github.com/ramasilveyra/gitpkg来“发布”来自 monorepos 的包作为 git 标签,它可能会有所帮助。

@ramasilveyra看起来非常有用——感谢添加👍

支持 git subdirs 作为安装源的一些消息?

谢谢,

我今天遇到了这个问题,当时我需要yarn add一个我为 monorepo 编写的尚未被接受/未发布的修复程序。 来自我的 +1。

佛京绝对类型导致同样的问题之王,
每次我分叉这个 git 时,为了准备一个新的拉取请求,我需要依赖我分叉的 git 的子目录。
file://是目前唯一的解决方案吗?

@UrielCh我能够使用https://github.com/ramasilveyra/gitpkg作为解决方法。 它也可能适用于您的情况。

感谢这个建议,为这个 fork 创建一个新的 git 会很简单。

你好! 我构建了https://github.com/ramasilveyra/gitpkg来“发布”来自 monorepos 的包作为 git 标签,它可能会有所帮助。

这在开始时可能看起来有点 hacky,但经过一些推理后,它似乎是解决问题的合法方法👍

说真的, gitpkg有效! 它在项目存储库中创建标签,并且可以与包含多个包的存储库一起使用。

这促使我放弃npm因为只有yarn可以很好地从 Git 中获取。

+1

你好! 我构建了https://github.com/ramasilveyra/gitpkg来“发布”来自 monorepos 的包作为 git 标签,它可能会有所帮助。

刚刚使用了gitpkg ,我认为这是一个很好的解决方案,应该在此用例的文档中添加为注释

我搭建了一个服务https://gitpkg.now.sh/ ,将一个git repo的子文件夹下载为.tgz文件,这样可以通过yarn和npm安装。 有了这个服务,包用户可以直接使用子目录,不需要包开发者发布子目录。

例如,如果你想在分支next-8-dev添加
只需使用:

yarn add https://gitpkg.now.sh/babel/babel/packages/babel-core?next-8-dev

也适用于npm install

请注意,我必须向@ramasilveyra说声抱歉,因为我的服务名称与他开发的工具冲突,但我之前并不知道。

@EqualMa这看起来很神奇。 我去看看这个。

@EqualMa如果它适用于具有构建步骤的项目,那就

我们还需要 gitpkg 吗? 运行最新的 lerna 并在独立模式下运行时,它将发布每个组件的 git 标签。

@erykpiast最后, GitPkg 服务支持自定义脚本,允许您在安装后或其他脚本中运行构建步骤! 您可以查看文档或尝试在https://gitpkg.now.sh添加自定义脚本

@EqualMa 简直太棒了! 谢谢!

有任何更新吗? 是计划好的还是什么?

@EqualMa太棒了! 很好!

我在尝试分叉一个使用工作区并在同一个 repo 中有多个包的 repo (https://github.com/ianstormtaylor/slate) 时遇到问题。 我只想修改和导入其中一个包。 尝试将yarn add指向包含单个 package.json 文件的目录会出现错误...

yarn add https://github.com/kr-project/slate/tree/master/packages/slate#e73db650a332fc5ded3fd72cffb1fcd7279b85d7
error https://github.com/kr-project/slate/tree/master/packages/slate: Extracting tar content of undefined failed, the file appears to be corrupt: "Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?"

我也尝试检查已发布的文件,但我的理解是,这是一个问题,即纱线查找仅在 github 存储库的根目录中找到的 tar?

那么是唯一的方法来 fork 一个使用工作区的项目来使用gitpkg吗? 我有点惊讶似乎没有更多的本地支持。

刚刚遇到了与@jason-krypton 完全相同的问题......尝试使用使用工作区的 repo 的分支,通常我只会添加分支的 git 存储库......现在我猜这是不可能的? 为了更改几行代码,浪费了大量时间。 :-(

我对 ckeditor5 有类似的问题。 我现在正在试用 GitPkg。

所以@LucidDan和其他人。

我发现以下方法有效:

  • 必须运行yarn 2.1.X才能使其正常工作。
  • 有关允许这样做的较新语法,请参阅此页面: https :
  • 您必须将monorepo 中每个包的单独条目添加到您的package.jsondependencies或,在我的情况下, devDependencies
"package-1": "my-org-name/mono-repo-name#head=my-git-branch&workspace=package-1"

令人失望的是,没有办法只让yarn安装顶级 monorepo 并将所有随附包展开到适当的位置。 也许有,我只是在这里很愚蠢? 如果是这样,有人启发我;-)

此页面是否有帮助?
0 / 5 - 0 等级