background
想要使用yarn从github上安装package, 但是有些比较难处理的部分:
-
需要安装的Github repo在enterprise Github上
虽然我们的enterprise Github 部署在公网,但是通过okta登录之后才能access,因此不能够保证yarn能够拉取
-
如果使用GitHub作为yarn的dependency,那么这个github的地址应该满足怎样的要求?repo中的内容又要满足什么样的要求?是不是什么样github repo都能放在
node_module
被正常是使用? -
需要将Github repo中的内容发布到npm registry中吗?
失败尝试
-
想要使用Github API直接让yarn去download release的压缩包
//package.json "example-react-form": "git@git.*****.com.au:our-organization/our-repo/tarball/v0.7.1-builder" //key: value
- 结果失败
Couldn't find any versions for "example-react-form" that matches "git@git.*****.com.au:our-organization/our-repo/tarball/v0.7.1-builder"? Please choose a version of "example-react-form" from this list: (Use arrow keys) - verison1 - verison2 ...
按照报错的翻译,yarn似乎将我的github url地址直接理解成了example-react-form的version了
说明:
- 我的Github repo地址写错了
Q1:为什么会match到example-react-form,甚至还给我提供了example-react-form
中的版本?
原因:在下面的描述中假设package.json中的左半边是key,右半边是value。
-
执行
yarn install
的流程- 根据给定的value,yarn会去判断应该到哪里寻找这个package(本地folder/npm registry/github..)
- 确定好目标地址,然后利用给定的value,拼接成最后的
resolved path
根据我们给定的value,yarn将地址理解成一个已经在npm registry 的package。
-
对于那些在npm registry中的dependency
- yarn会将key作为packagename,value作为version。
- 使用
key@value
拼成resolved path.
结果,yarn在
npm registry
上根本找不到example-react-form
的git@git.*****.com.au:our-organization/our-repo/tarball/v0.7.1-builder
版本,只好给出example-react-form
上的所有版本让我选择。
-
假如"npm" registry上没有你给定的key,那么就会报错
Couldn't find package "example-react-form" on the "npm" registry.
Q2:这个地址名为啥会有问题呢?
搜罗了npm install的doc,有两种情况match这种case:
-
npm install <tarball url>
: In order to distinguish between this and other options, the argument must start withhttp://
orhttps://
说明虽然我的value也是一个tarball,但是使用方法明确跟doc上不一样。
修改为:
"example-react-form": "https://****/origanziation/example-react-form/tarball/v0.7.1-builder"
- 继续报错
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?"
出现这样的错误,主要原因是,yarn无权访问enterprise github,所以根本找不到压缩包。才会报错。
- 一旦使用
Github
的公有地址(企业Github的地址) 就会出现这种错误
看起来这种方式没有可能了,那么我们换下一种方式
- 继续报错
-
npm install <git remote url>
-
git remote url:
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]
-
protocol: is one of git, git+ssh, git+http, git+https, or git+file.
-
#<commitId>
: 会获取对应commit的code -
#<tagName>
: 会获取对应tagName相对的commit的code -
#semver:<semver>
: <semver>可以对应一个tagname,下载对应tag的内容
一样两个参数如果都没有设置,那么会使用master上最近的commit的code
最后使用
//package.json "example-react-form": "git+ssh:git@git.*****.com.au:our- organization/our-repo.git#v0.7.1-builder"//key: value
-
-
解惑
npm 可以接受很多类型作为dependency,但是前提必须是npm project,也就是说这个folder中要包含package.json文件
- 可以是一个folder(本地path)
- 可以是一个压缩包(本地path)
- 可以是一个远端的压缩包(github tarball)
- 可以是一个发布在register的压缩包(<name>@<version>)
- 可以是一个git repo
但是path的写法需要严格按照文档的要求去写
网友评论