如何从 yarn.lock 知道当前安装包的版本
How to know the version of currently installed package from yarn.lock
我正在编写一个内部工具来比较项目中安装的版本,并且只允许传递特定版本。为此,我必须检查 yarn.lock
文件中解析的版本,因为 package.json 文件有一个 semver 范围,而不是特定版本,并且它不会告诉你依赖关系的依赖关系。
我尝试使用 yarn list
命令,但它也会打印语义版本范围并且很难解析(即使使用 --json
选项)。
所以 yarn.lock
似乎是唯一的方法。我知道 yarn.lock
可能有同一个包的不同版本,在这种情况下我只想要安装在 node_nodules
中的版本(必须只是其中之一)。我不知道如何解析锁定文件。
我能想到的另一种方法是实际进入 node_modules
文件夹并检查包的 package.json
中的版本。
上述选项的 None 在我看来很干净。有什么方法可以让我尽可能轻松、清晰地知道特定包的已解析版本(前提是我知道包的名称并且我知道它已安装)?
更新:
我实际上想要安装包的所有版本(即使它们在依赖树中真的很深)。
我发现 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' ]
npm list --depth=0
比 yarn why <each package>
快 1000 倍。
它还会告诉您无关的依赖项、未满足的对等依赖项等,但输出非常干净——仍然比 yarn why
更干净
因为你知道包的名称,所以这样做:
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
对于程序化使用,我喜欢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
由于 yarn list
尚未为较新版本的 Yarn 实现,并且 yarn why
可能有点难以解析,因此 yarn info
是另一种选择。它输出在 yarn.lock.
中解析的版本
$ yarn info sass -A
└─ sass@npm:1.41.0
├─ Version: 1.41.0
│
├─ Exported Binaries
│ └─ sass
│
└─ Dependencies
└─ chokidar@npm:>=3.0.0 <4.0.0 → npm:3.5.2
或者,只获取名称和版本:
$ yarn info sass -A --name-only
└─ sass@npm:1.41.0
为了只获取版本,您可以使用 --json
标志以更机器可读的格式输出,然后用 jq
:
解析它
$ yarn info sass -A --json | jq ".children.Version"
"1.41.0"
我正在编写一个内部工具来比较项目中安装的版本,并且只允许传递特定版本。为此,我必须检查 yarn.lock
文件中解析的版本,因为 package.json 文件有一个 semver 范围,而不是特定版本,并且它不会告诉你依赖关系的依赖关系。
我尝试使用 yarn list
命令,但它也会打印语义版本范围并且很难解析(即使使用 --json
选项)。
所以 yarn.lock
似乎是唯一的方法。我知道 yarn.lock
可能有同一个包的不同版本,在这种情况下我只想要安装在 node_nodules
中的版本(必须只是其中之一)。我不知道如何解析锁定文件。
我能想到的另一种方法是实际进入 node_modules
文件夹并检查包的 package.json
中的版本。
None 在我看来很干净。有什么方法可以让我尽可能轻松、清晰地知道特定包的已解析版本(前提是我知道包的名称并且我知道它已安装)?
更新:
我实际上想要安装包的所有版本(即使它们在依赖树中真的很深)。
我发现 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' ]
npm list --depth=0
比 yarn why <each package>
快 1000 倍。
它还会告诉您无关的依赖项、未满足的对等依赖项等,但输出非常干净——仍然比 yarn why
因为你知道包的名称,所以这样做:
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
对于程序化使用,我喜欢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
由于 yarn list
尚未为较新版本的 Yarn 实现,并且 yarn why
可能有点难以解析,因此 yarn info
是另一种选择。它输出在 yarn.lock.
$ yarn info sass -A
└─ sass@npm:1.41.0
├─ Version: 1.41.0
│
├─ Exported Binaries
│ └─ sass
│
└─ Dependencies
└─ chokidar@npm:>=3.0.0 <4.0.0 → npm:3.5.2
或者,只获取名称和版本:
$ yarn info sass -A --name-only
└─ sass@npm:1.41.0
为了只获取版本,您可以使用 --json
标志以更机器可读的格式输出,然后用 jq
:
$ yarn info sass -A --json | jq ".children.Version"
"1.41.0"