【发布时间】:2021-01-04 10:53:16
【问题描述】:
我想从头开始重新安装 npm。我希望在重新安装后重新安装已全局安装的软件包in npm。导出和导入全局安装的模块的最安全(和非手动)方法是什么?
实施说明:我的旧 npm 还需要 sudo 进行全局安装,所以我并不是真的希望重用相同的目录,而是让新 npm 安装与旧 npm 相同的包列表。
【问题讨论】:
标签: npm
我想从头开始重新安装 npm。我希望在重新安装后重新安装已全局安装的软件包in npm。导出和导入全局安装的模块的最安全(和非手动)方法是什么?
实施说明:我的旧 npm 还需要 sudo 进行全局安装,所以我并不是真的希望重用相同的目录,而是让新 npm 安装与旧 npm 相同的包列表。
【问题讨论】:
标签: npm
# Export
npm list --global --parseable --depth=0 | sed '1d' | awk '{gsub(/\/.*\//,"",$1); print}' > path/to/npmfile
# Import
xargs npm install --global < path/to/npmfile
尽管接受的答案给出了一个指针,但它并没有清楚地显示如何导出/导入全局 NPM 包。
简单的npm list 的输出很难解析:
$ npm list --global --depth=0
/usr/local/lib
├── api-designer@0.1.2
├── bower@1.7.9
├── browserify@13.1.0
├── grunt@1.0.1
├── gulp@3.9.1
├── kong-dashboard@1.1.2
├── npm@3.10.9
├── typescript@2.0.3
├── vue-cli@2.3.1
├── webpack@1.13.2
├── webpack-dev-server@1.16.1
└── yo@1.8.4
这个输出有3个问题:
└── 使其难以解析幸运的是,NPM 开发人员考虑周到,包含了--parseable 选项:
$ npm list --global --depth=0 --parseable
/usr/local/lib
/usr/local/lib/node_modules/api-designer
/usr/local/lib/node_modules/bower
/usr/local/lib/node_modules/browserify
/usr/local/lib/node_modules/grunt
/usr/local/lib/node_modules/gulp
/usr/local/lib/node_modules/kong-dashboard
/usr/local/lib/node_modules/npm
/usr/local/lib/node_modules/typescript
/usr/local/lib/node_modules/vue-cli
/usr/local/lib/node_modules/webpack
/usr/local/lib/node_modules/webpack-dev-server
/usr/local/lib/node_modules/yo
现在,问题是:
/usr/local/lib/node_modules/)如果我们将输出通过管道传输到sed '1d',我们就去掉了第一行。然后我们可以通过管道输出到awk 来删除路径前缀,以获得已安装包名称的干净列表。
$ npm list --global --parseable --depth=0 | sed '1d' | awk '{gsub(/\/.*\//,"",$1); print}'
api-designer
bower
browserify
grunt
gulp
kong-dashboard
npm
typescript
vue-cli
webpack
webpack-dev-server
yo
您可以简单地附加一个> /path/to/file 以将输出保存到文件中。然后安装这些软件包的最新版本:
xargs npm install --global < path/to/file
您可以安全地删除 --global 参数,以导入/导出本地安装的 npm 包。
【讨论】:
npm list --global --depth=0 | sed '1d' | awk '{gsub(/[├└]\─*\S/,"",$1); print}' > path/to/npmfile
> /path/to/file 的部分。我该怎么做呢?我在这部分迷路了。我会通知一个文件名,它将保存整个包列表(输出)?然后我使用相同的文件引用将包安装到我的项目中?
path/to/file 更改为输出文件的真实路径。查找“Linux I/O 重定向”。
npm ls -g --depth=0
将为您提供已全局安装的模块(及其版本)列表。从输出中,您将能够生成您需要的npm install 命令(取决于您是否想要保留版本/您的操作系统......)
【讨论】:
我在带有 PowerShell 的 Windows 上使用它:
[string]::join(" ", ((npm ls -g --depth=0) | select -skip 1 | select -skiplast 1 | % { $_.remove(0,4) }))
【讨论】:
注意:
sudo 安装 npm 包的环境下进行测试这是一个 bash 脚本,用于重新安装所有 npm 全局包而不导出到文件:
#!/bin/bash
list="$(npm list --global --parseable --depth=0 | sed '1d')"
newlist=""
for i in $list; do
name="${i##*/}"
newlist+="$name "
done
echo "npm install --global $newlist"
npm install --global $newlist
如果您想将全局包导出到文件并稍后安装:
导出:
#!/bin/bash
# export npm global packages to a backup file
list="$(npm list --global --parseable --depth=0 | sed '1d')"
exportFile="npm_global_pkgs.bkp"
while [ -f "$exportFile" ]; do
echo "$exportFile exists, try another file name?"
read exportFile
done
newlist=""
for i in $list; do
newlist+="${i##*/} "
done
echo "$newlist" > "$exportFile"
echo "Packages exported to "$exportFile":
$newlist"
导入
#!/bin/bash
# install npm global packages from a backup file
echo "Enter the importing filename:"
read importFile
list="$(cat "$importFile")"
echo "npm i -g $list"
npm i -g $list
如果您不熟悉如何创建和执行 bash 脚本: 将每个代码粘贴到单独的文件中,保存。 您可能需要添加可执行权限:
chmod u+x 'filename'
然后执行你想要的脚本:
./filename
【讨论】:
我到这里是因为需要将一个节点版本 X 的包列表重新安装到另一个节点版本 Y,所以基于前面的示例和不同的观点,我使用以下命令实现了这一点:
# get the node modules directory with backslashes included for a correct string replacement
p_replace=$(printf "$(npm config get prefix)/lib/node_modules\n"|sed -e 's|/|\\/|g')
# apply a string replacement with the previous getting value
npm list -g --parseable --depth 0 | sed '1d' |sed -E "s|$p_replace\/||g" > /tmp/node_packages
在我的情况下,我得到了这样的最终输出:
$ cat /tmp/node_packages
@vue/cli-service-global
apidoc
browserslist
bufferutil
create-react-app
express-generator
nodemon
npm
serve
utf-8-validate
wscat
最后,我简单地执行了以下命令来重新安装所需的包:
xargs -I value npm install -g value < /tmp/node_packages
作为包准确性的一部分,我执行了以下验证:
$ nvm use v11.14.0 && npm list -g --depth 0 && \
nvm use stable && npm list -g --depth 0
Now using node v11.14.0 (npm v6.14.10)
/home/mlazo/.nvm/versions/node/v11.14.0/lib
├── @vue/cli-service-global@4.1.1
├── apidoc@0.24.0
├── browserslist@4.12.0
├── bufferutil@4.0.1
├── create-react-app@3.4.1
├── express-generator@4.16.1
├── nodemon@2.0.4
├── npm@6.14.10
├── serve@11.3.2
├── utf-8-validate@5.0.2
└── wscat@4.0.0
Now using node v15.5.0 (npm v6.14.10)
/home/mlazo/.nvm/versions/node/v15.5.0/lib
├── @vue/cli-service-global@4.5.9
├── apidoc@0.25.0
├── browserslist@4.16.0
├── bufferutil@4.0.3
├── create-react-app@4.0.1
├── express-generator@4.16.1
├── nodemon@2.0.6
├── npm@6.14.10
├── serve@11.3.2
├── utf-8-validate@5.0.4
└── wscat@4.0.1
我真的希望这对任何面临类似节点版本迁移情况的人有所帮助。
最好的问候,
曼努埃尔·拉佐
【讨论】: