【问题标题】:Properly configure NPM package which depends on local packages正确配置依赖本地包的 NPM 包
【发布时间】:2016-10-20 18:12:01
【问题描述】:

我有这三个本地 npm 包:C:\projects\AC:\projects\BC:\projects\mainMain 是使用 Webpack 构建的 React 应用程序。 Main 依赖于AB,同样A 依赖于B。我们有自己的“全局”包管理器,可以保证包位于同一个父文件夹中。

我想适合这些:

  1. Node 的(和 webpack 的)require 将解析本地包

  2. 我不需要在每次更改AB 时在Main 中输入npm install

我在Mainpackage.json 中做到了这一点:

....
"dependencies": {
    "A": "file:../A",
    "B": "file:../B",
    "react": ...
    .........

但是遇到了奇怪的问题:npm 没有安装AB 的node_modules 中的所有包,所以Webpack 构建失败。而且我每次都需要运行npm install

我用谷歌搜索发现linklocal,它将所有本地包替换为符号链接。但是遇到了另一个问题:

linklocal 不会安装链接依赖项的依赖项,因此您通常会安装两次链接依赖项的依赖项:一次在 npm 安装期间,然后在 linklocal 之后再次安装

所以我在postinstall 脚本中再次运行linklocalnpm install。但是 npm@3 没有对符号链接文件夹做任何事情:

npm WARN update-linked node_modules/A needs updating to 1.0.0 from 1.0.0 but we can't, as it's a symlink

然后我决定修改postinstall 以转到每个符号链接模块并从那里运行npm install。乍一看,它运行良好:安装运行良好,以及 webpack 捆绑。但是 Webpack 开始捆绑两个 React 副本(这是被禁止的)。

如何正确配置我的包?

【问题讨论】:

    标签: node.js npm webpack symlink npm-install


    【解决方案1】:

    在包 A 和包 B 中,您可以有一个执行 webpackpreinstall 脚本。这应该解决所有依赖项。
    在你的主包上,你应该链接到包 A 和 B 的 dist(build) 文件夹。
    还要检查这个库wml,它可以帮助你保持本地依赖的同步。

    package.json:

    "scripts": { "preinstall": "webpack" }

    【讨论】:

      【解决方案2】:

      如果您不需要在其他机器上构建 Main,您可以在您的项目/Main 中执行类似的操作

      let C = require('C:\projects\A\index.js')
      

      或者你可以有一个分支

      require('C:\projects\A\index.js')
      

      还有一个:

      require('C')
      

      【讨论】:

        【解决方案3】:

        您可以在本地使用npm link 来维护指向您本地开发版本的符号链接..

        因此,重置 Main 中的 package.json 以指向已发布包实际存在的位置:

         "dependencies": {
            "A": "<PUBLISHED_PACKAGE_REPO>",
            "B": "<PUBLISHED_PACKAGE_LOCATION>",
            "react": ...
        

        这确保您的项目将始终构建在 CI / 其他机器等上。

        然后,导航到您的“项目 A”目录并创建一个链接:

        cd projects\A
        npm link
        

        这将创建一个指向 C:\projects\A 的特定于 npm 的符号链接。

        然后对B项目做同样的事情:

        cd projects\B
        npm link
        

        您现在已经创建了两个项目链接,只需将它们实际链接到您的 Main 项目:

        cd projects\Main
        npm link A
        npm link B
        

        如果A 也依赖于B,您也只需链接这些项目:

        cd projects\A
        npm link B
        

        当您完成开发并想要使用 package.json 中指定的任何内容时,只需取消链接并安装:

        cd projects\Main
        npm unlink A
        npm unlink B
        npm install
        

        【讨论】:

          【解决方案4】:

          我个人使用npm pack 来打包我的依赖项,然后使用`npm install ./path/to/pack/result.tgz 将它们安装到我的主项目中,详细说明here

          它避免发布对 A 和 B 所做的所有更改,但不会阻止您发布

          每次我更改AB时,npm install都在Main

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-08
            • 2017-09-13
            • 1970-01-01
            • 2020-01-25
            • 1970-01-01
            • 2018-11-01
            • 2017-12-09
            • 2018-07-19
            相关资源
            最近更新 更多