导出导入npm全局包

时间:2015-09-17 10:41:10

标签: npm

我想从头开始重新安装npm。我希望在重新安装后重新安装已在 npm中全局安装的软件包。导出和导入全局安装模块的最安全(和非手动)方式是什么?

实施说明:我的旧npm也需要sudo进行全局安装,所以我真的不想重复使用同一个目录,而是让新的npm安装与旧版本相同的软件包列表。

5 个答案:

答案 0 :(得分:6)

TL;博士

# 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个问题:

  1. 第一行不是包名称
  2. 那些└──难以解析
  3. 版本不可取(至少在我的情况下)
  4. 幸运的是,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
    

    现在,问题是:

    1. 第一行不以包名称结尾,而其他行
    2. 包名称前的路径前缀(/usr/local/lib/node_modules/
    3. 如果我们将输出传递给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

我真的希望这对面临类似节点版本迁移情况的任何人都有帮助。

最好的问候,

曼努埃尔·拉索