如何从yarn.lock知道当前安装的软件包的版本

时间:2020-02-28 14:58:55

标签: javascript node.js typescript yarnpkg

我正在编写一个内部工具,用于比较项目中安装的版本,并且仅允许传递某些版本。为此,我必须检查yarn.lock文件中解析的版本,因为package.json文件具有一个semver范围,而不是特定的版本,并且它始终不会告诉您该依赖项的依赖关系。

我尝试使用yarn list命令,但是它也会打印semver范围,并且很难解析(即使使用--json选项也是如此)。 因此,yarn.lock似乎是唯一的方法。我知道yarn.lock可能具有同一软件包的单独版本,在这种情况下,我只希望安装其中的版本。node_nodules(必须只是其中之一)。我不知道如何解析锁文件。

我想到的另一种方法是实际上进入node_modules文件夹并检查软件包package.json中的版本。

以上选项对我来说都不是干净的。有什么办法可以使我尽可能轻松,整洁地知道特定程序包的解析版本(前提是我知道该程序包的名称并且知道该程序包已安装)?

更新
我实际上想要安装的软件包的所有版本(即使它们确实在依赖树中很深)。

3 个答案:

答案 0 :(得分:9)

我发现yarn why是找出当前安装的软件包版本的最佳方法(感谢我的一位同事向我指出)。这就是我的测试代码在JavaScript中的外观。

const { spawnSync } = require('child_process');
const packageName = 'micromatch';
const whyBuffer = spawnSync('yarn', ['why', packageName]);
const grepBuffer = spawnSync('grep', ['Found'], { input: whyBuffer.stdout });
const outputArray = grepBuffer.stdout.toString().split('\n');
console.log(outputArray); // ['info \r=> Found "micromatch@3.1.10"',    'info \r=> Found "fast-glob#micromatch@4.0.2"', ''  ]
const parsedOutputArray = outputArray.filter(output => output.length > 0).map((output) => output.split('@')[1].replace('"', ''))
console.log(parsedOutputArray); // [ '3.1.10', '4.0.2' ]

答案 1 :(得分:8)

既然您知道包的名称,请执行以下操作:

yarn list --pattern <package_name>

上述命令将为您提供任何深度的软件包的所有已安装版本。例如,我在不同深度安装了不同版本的 camelcase 库。运行命令:yarn list --pattern "camelcase",这是输出:

yarn list v1.22.5
├─ camelcase@6.2.0
└─ yargs-parser@13.1.2
   └─ camelcase@5.3.1

答案 2 :(得分:0)

npm list --depth=0yarn why <each package> 快 1000 倍。 它还告诉您无关的依赖项、未满足的对等依赖项等,但输出非常干净 - 仍然比 yarn why

干净