正确配置NPM包,这取决于本地包

时间:2016-10-20 18:12:02

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

我有三个本地npm包:C:\projects\AC:\projects\BC:\projects\mainMain是使用Webpack构建的React应用程序。 Main取决于ABA取决于B。我们有自己的"全球"包管理器,它保证包将位于同一个父文件夹中。

我想适合这些:

  1. 节点(和webpack' s)require将解析本地包

  2. 每次更改npm installMain

  3. 时,我都不需要A B

    我是在Main' package.json

    中完成的
    ....
    "dependencies": {
        "A": "file:../A",
        "B": "file:../B",
        "react": ...
        .........
    

    但遇到了一个奇怪的问题:npm并未在AB的node_modules中安装所有软件包,因此Webpack构建失败。我需要每次都运行npm install

    我用Google搜索并找到了linklocal,它将所有本地包替换为符号链接。但遇到了另一个问题:

      

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

    所以我在linklocal脚本中再次运行npm install然后postinstall。但是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 bunding。但Webpack开始捆绑两份React(禁止使用)。

    如何正确配置我的包?

4 个答案:

答案 0 :(得分:1)

在包A和包B中,您可以使用预安装脚本执行 webpack 。这应该解决所有依赖项。
在主程序包上,您应该链接到包A和B的 dist (构建)文件夹  另请查看此库wml,它可以帮助您保持本地依赖关系
package.json:

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

答案 1 :(得分:1)

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

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

或者您可以使用

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

还有另一个:

require('C')

答案 2 :(得分:0)

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

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

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

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

然后,导航到您的&#34;项目A&#34;目录并创建一个链接:

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

答案 3 :(得分:0)

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

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

  每当我更改npm installMain时,A中的{p> B