【问题标题】:Export import npm global packages导出导入 npm 全局包
【发布时间】:2021-01-04 10:53:16
【问题描述】:

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

实施说明:我的旧 npm 还需要 sudo 进行全局安装,所以我并不是真的希望重用相同的目录,而是让新 npm 安装与旧 npm 相同的包列表。

【问题讨论】:

    标签: npm


    【解决方案1】:

    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. 版本不理想(至少在我的情况下)

    幸运的是,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/)

    如果我们将输出通过管道传输到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
    

    您可以简单地附加一个&gt; /path/to/file 以将输出保存到文件中。然后安装这些软件包的最新版本:

    xargs npm install --global < path/to/file
    

    您可以安全地删除 --global 参数,以导入/导出本地安装的 npm 包。

    【讨论】:

    • 如果有人想要导出版本然后将第一个喜欢更改为npm list --global --depth=0 | sed '1d' | awk '{gsub(/[├└]\─*\S/,"",$1); print}' &gt; path/to/npmfile
    • @sepehr:谢谢一百万!最后,我可以在我不断发展的备份/恢复脚本中包含 NPM 包,并真正了解我在做什么。很好的解释!
    • @SumitKumar @sepehr 你好。我没有得到附加&gt; /path/to/file 的部分。我该怎么做呢?我在这部分迷路了。我会通知一个文件名,它将保存整个包列表(输出)?然后我使用相同的文件引用将包安装到我的项目中?
    • @Aliohr 你是对的。将path/to/file 更改为输出文件的真实路径。查找“Linux I/O 重定向”。
    • @sepehr 非常感谢您在这里回复我。我以为你们会花很长时间来检查这个旧讨论。我正在使用 macOS 操作系统,但我只是不明白如何重定向此路径。我被困在看到已安装包名称的干净列表的部分。 =D 我对终端仍然很笨。在探索更多内在环境之前,新开发人员仍在代码语法上投入数小时。您能否详细说明一下,以便我通过一个实际示例来理解?
    【解决方案2】:
    npm ls -g --depth=0
    

    将为您提供已全局安装的模块(及其版本)列表。从输出中,您将能够生成您需要的npm install 命令(取决于您是否想要保留版本/您的操作系统......)

    【讨论】:

    • 看起来不错!当我完成该过程时需要回到这里标记它已接受,因为它目前取决于早期的问题......
    【解决方案3】:

    我在带有 PowerShell 的 Windows 上使用它:

    [string]::join(" ", ((npm ls -g --depth=0) | select -skip 1 | select -skiplast 1 | % { $_.remove(0,4) }))

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案5】:

        我到这里是因为需要将一个节点版本 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
        

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

        最好的问候,

        曼努埃尔·拉佐

        【讨论】:

          猜你喜欢
          • 2021-06-02
          • 2020-12-10
          • 2018-11-17
          • 2019-01-21
          • 2013-04-29
          • 2017-03-15
          • 1970-01-01
          • 2021-10-06
          • 1970-01-01
          相关资源
          最近更新 更多