1. 首页
  2. 前端

实现yarn.lock与package-lock.json相互转换

实现yarn.lock与package-lock.json相互转换

好多小伙伴在git上下载的vue/react/Angular源码是基于yarn的,或者自己之前使用的是yarn的,现在想要换成package的,却不知道如何转化,在这里,就关于yarn.lock与package-lock.json相互转换过程,进行详细的介绍,反之亦然。

这里使用synp进行转化。

1.install

npm install -g synp

2.命令行用法

yarn.lock => package-lock.json

yarn # 确保node_modules文件夹目录并更新
synp --source-file /path/to/yarn.lock
# 将创建/path/to/package-lock.json

package-lock.json => yarn.lock

npm install # 确保node_modules目录存在并更新
synp --source-file /path/to/package-lock.json
# 将创建/path/to/yarn.lock

注意:如果您只需要按此方向转换(package-lock.json => yarn.lock),从1.7.0开始,Yarn可以从npm的package-lock.json本机导入其依赖关系树,无需外部工具。 使用yarn import命令。

程序使用:

const { npmToYarn, yarnToNpm } = require('synp')

const libPath = '/path/to/my/lib'
const stringifiedYarnLock = npmToYarn(libPath)
const stringifiedPackageLock = yarnToNpm(libPath)

它是如何工作的?

由于package-lock.json和yarn.lock使用不同的方法来确定性地锁定依赖版本,因此它们通常不包含纯转换所需的所有信息。因此,synp使用程序包的现有node_modules目录来确定程序包状态并协助转换。因此,确保程序包的node_modules目录是最新的并且由相应的工具安装是至关重要的(例如,如果转换为package-lock.json则通过yarn进行安装,如果转换为yarn.lock则通过npm进行安装)。

注意事项

1.捆绑的依赖项:由于各种原因,此工具不能与捆绑的依赖项“很好地”运行。 这应该不是问题,因为稍后使用转换后的文件安装软件包将(根据定义)更新文件中的正确软件包。

2.包校验:yarn.lock和package-lock.json都包含依赖项的包校验。 因为npm正在慢慢转向sha-512校验,而yarn 还没有支持,所以转换为package-lock.json会导致校验变弱(这仍然有效!)并且转换为yarn.lock有时会导致损坏结果文件。 值得庆幸的是,这个问题是100%可解决的。 在npm中,只需删除所有或相关包的完整性字段即可更新校验。在yarn 中,从创建的文件安装时,可以使用–update-checksums *标志来解决。

3.格式限制:一些可以用一种格式表达的东西根本无法在另一种格式中表达。 这些(据我所知)极端边缘情况,不应该担心这个工具的99%的目标用户。 一个例子是package-lock.json将相同的semver字符串转换为不同版本的能力。 (例如,一个包请求版本^ 1.0.1的依赖关系并接收1.0.5和一个不同的包请求版本^ 1.0.1的相同依赖关系并接收1.0.71。当通过synp转换为yarn.lock时,两者都会收到相同的版本)。

4.可选包:与npm(https://github.com/npm/npm/issues/17722)一样,synp也存在跨不同平台的可选依赖问题。 这是因为它使用node_modules作为其状态,并且不会检测转换平台上未安装的软件包。 遗憾的是,像npm一样,避免此问题的唯一方法是在满足大多数可选依赖的平台上执行转换,并手动更新其余部分。

*在撰写本文时,yarn中的–update-checksums标志已合并但尚未发布。 请参阅:https://github.com/yarnpkg/yarn/pull/4860

原创文章,作者:Ferrycoln,如若转载,请注明出处:https://ms200.cn/archives/910

发表评论

邮箱地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:499661635@qq.com.com

工作时间:周一至周五,9:30-18:30

QR code