如何用npm批量下载指定scope下的所有包至内部Artifactory?
批量拉取指定Scope下所有NPM包的可行方案
这个需求确实挺普遍的,npm本身没提供npm pack @progress/*这种直接通配的命令,但咱们可以通过脚本或者工具来实现批量操作,给你几个靠谱的方案:
方案一:Shell脚本+npm view批量打包
这是最直接的方式,先获取Scope下的所有包名,再循环执行打包命令:
- 首先安装
jq(用来处理JSON输出,没装的话可以用npm install -g jq或者系统包管理工具安装) - 执行下面的脚本,一次性打包
@progress下所有包:
# 获取@progress下的所有包名并循环打包 npm view @progress/* name --json | jq -r '.[]' | while read pkg; do echo "开始打包 ${pkg}..." npm pack "$pkg" done
这个脚本会先拉取@progress下所有包的名称列表,然后逐个执行npm pack,打包后的.tgz文件都会放在当前目录。
方案二:Node.js脚本实现(适合不熟悉Shell的同学)
如果更习惯用Node.js写脚本,也可以用下面的代码:
const { execSync } = require('child_process'); try { // 获取指定Scope下的所有包名称 const pkgList = JSON.parse(execSync('npm view @progress/* name --json', { encoding: 'utf8' })); pkgList.forEach(pkg => { console.log(`正在处理 ${pkg}...`); // 执行打包命令,输出实时打印到控制台 execSync(`npm pack ${pkg}`, { stdio: 'inherit' }); }); console.log('所有包打包完成!'); } catch (err) { console.error('打包过程出错:', err.message); }
把这段代码保存成sync-packages.js,然后运行node sync-packages.js就行。
方案三:利用Artifactory本身的同步能力(更省心)
如果你们公司的Artifactory支持配置远程仓库代理,其实可以直接在Artifactory里添加npmjs.com作为远程源,然后设置只同步@progress这个Scope的包。这样后续不仅能一次性同步现有包,新发布的包也能自动同步,不用每次手动打包上传。
具体操作大概是:
- 在Artifactory里创建一个远程仓库,指向
https://registry.npmjs.org/ - 在仓库的
Advanced设置里,添加@progress/*作为Include Patterns,这样只会同步这个Scope下的包 - 配置完成后,Artifactory会自动拉取并缓存
@progress下的所有包,后续内部使用直接从Artifactory拉取就行
额外注意事项
- 如果
@progress是私有Scope,确保已经用npm login登录了对应的私有仓库,不然会拉取不到包 - 默认
npm pack会拉取包的最新版本,要是需要指定版本,可以把命令改成npm pack ${pkg}@x.x.x或者npm pack ${pkg}@latest - 打包完成后,批量上传到Artifactory可以用Artifactory的CLI工具
jfrog rt upload,比如jfrog rt upload "*.tgz" <你的内部仓库路径>
内容的提问来源于stack exchange,提问作者cjones26
相关产品推荐
相关产品推荐

