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

noo*_*oob 14 javascript node.js typescript yarnpkg

我正在编写一个内部工具,它比较项目中安装的版本,并且只允许通过某些版本。为此,我必须检查yarn.lock文件中解析的版本,因为 package.json 文件有一个 semver 范围,而不是特定版本,它无论如何都不会告诉您依赖项的依赖项。

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

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

以上选项对我来说都不干净。有什么方法可以让我尽可能轻松地了解特定包的解析版本(前提是我知道包的名称并且我知道它已安装)?

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

noo*_*oob 17

我发现这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' ]
Run Code Online (Sandbox Code Playgroud)

  • @TimeKiller 它不会告诉您已安装软件包的确切版本。而且它不会告诉您任何有关传递依赖的信息。 (2认同)

Bin*_*ati 8

由于您知道包的名称,因此请执行以下操作:

yarn list --pattern <package_name>
Run Code Online (Sandbox Code Playgroud)

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

yarn list v1.22.5
?? camelcase@6.2.0
?? yargs-parser@13.1.2
   ?? camelcase@5.3.1
Run Code Online (Sandbox Code Playgroud)

  • 找不到名为“list”的脚本 (10认同)

Jas*_*les 7

对于编程使用,我喜欢yarn list

yarn list --pattern lodash --depth=0 --json --non-interactive --no-progress | jq -r '.data.trees[].name'
lodash@4.17.21
lodash.defaults@4.2.0
lodash.flatten@4.4.0
lodash.isarguments@3.1.0
lodash.memoize@3.0.4
Run Code Online (Sandbox Code Playgroud)

为了更好的编程使用:https://www.npmjs.com/package/@yarnpkg/lockfile