我想从头开始重新安装npm。我希望在重新安装后重新安装已在 npm中全局安装的软件包。导出和导入全局安装模块的最安全(和非手动)方式是什么?
实施说明:我的旧npm也需要sudo进行全局安装,所以我真的不想重复使用同一个目录,而是让新的npm安装与旧版本相同的软件包列表。
答案 0 :(得分:6)
# 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
arg,以导入/导出本地安装的npm包。
答案 1 :(得分:3)
npm ls -g --depth=0
将为您提供全局安装的模块(及其版本)列表。从输出中,您将能够生成您需要的npm install
命令(取决于您是否要保留版本/您的操作系统......)
答案 2 :(得分:0)
注意:
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
答案 3 :(得分:0)
我在Windows上使用PowerShell将其使用:
[string]::join(" ", ((npm ls -g --depth=0) | select -skip 1 | select -skiplast 1 | % { $_.remove(0,4) }))
答案 4 :(得分:0)
我来到这里是因为需要重新安装从一个节点版本 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
我真的希望这对面临类似节点版本迁移情况的任何人都有帮助。
最好的问候,
曼努埃尔·拉索