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

mic*_*kov 6 symlink node.js npm webpack npm-install

我有这三个地方的NPM包:C:\projects\A,C:\projects\BC:\projects\main.Main是使用Webpack构建的React应用程序.Main依赖于AB,也A要看B.我们有自己的"全局"包管理器,可以保证包位于同一个父文件夹中.

我想适合这些:

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

  2. 我不需要npm installMain我每次更改AB

我是这样做Mainpackage.json:

....
"dependencies": {
    "A": "file:../A",
    "B": "file:../B",
    "react": ...
    .........
Run Code Online (Sandbox Code Playgroud)

但遇到了一个奇怪的问题:npm没有在A's和B's 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
Run Code Online (Sandbox Code Playgroud)

然后我决定修改postinstall去每个符号链接的模块并npm install从那里运行.它一见倾心:安装运行良好,以及webpack bunding.但Webpack开始捆绑两份React(禁止使用).

如何正确配置我的包?

dun*_*all 0

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

因此,将package.jsonin重置Main为指向已发布的包实际存在的位置:

 "dependencies": {
    "A": "<PUBLISHED_PACKAGE_REPO>",
    "B": "<PUBLISHED_PACKAGE_LOCATION>",
    "react": ...
Run Code Online (Sandbox Code Playgroud)

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

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

cd projects\A
npm link
Run Code Online (Sandbox Code Playgroud)

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

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

cd projects\B
npm link
Run Code Online (Sandbox Code Playgroud)

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

cd projects\Main
npm link A
npm link B
Run Code Online (Sandbox Code Playgroud)

如果A还取决于B您也只需要链接这些项目:

cd projects\A
npm link B
Run Code Online (Sandbox Code Playgroud)

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

cd projects\Main
npm unlink A
npm unlink B
npm install
Run Code Online (Sandbox Code Playgroud)