7

设想

  • 我在用npm 5.8.0
  • 我有一个ProjectA和一个ProjectB
  • ProjectB是一个依赖ProjectA
  • 这两个项目都通过 Webpack 捆绑和运行(如果需要,我可以提供我的配置)。

出于开发目的,我ProjectBProjectApackage.json 中通过"projectB": "file:../projectB". 基本上我需要的唯一文件在libWebpack 输出的文件夹中。

问题

如果我使用上述配置安装此依赖项,npm 会将整个ProjectB-folder 安装到 node_modules 中。它将包含所有projectB的 node_modules、配置文件、src 文件夹等。

除了这不是预期的行为之外,这还会导致错误。例如,一些已安装的@types 会抛出错误,因为它们被认为是重复的。@types 和其他包ProjectA似乎ProjectB“碰撞”。"dependencies"这些包在两者中都被引用,ProjectA并且ProjectB大部分被引用。

我试过的

npm 链接

如果我使用 npm 链接,则会出现相同的(见上文)行为。整个文件夹将安装到ProjectA's node_modules.

npm 包

我实际上确实有一个-file in可能很重要。所以当我使用一个文件时就生成了。如果我然后通过一切正常安装。我认为确实考虑了-file 。.npmignoreProjectBnpm packprojectB.tgzProjectB"projectB": "file:../projectB.tgz"npm pack.npmignore

我对这个解决方案的问题是,我不仅必须在ProjectB每次对其应用更改时进行构建,而且还要npm pack对其进行构建。

删除ProjectB的 node_modules

我想这是最愚蠢的解决方法。如果我再次引用ProjectBvia"projectB": "file:../projectB"但在构建它之后删除它的 node_modules,它们在安装后不会出现。因此,我不再有任何例外。

我想这也不是一个有效的解决方案,因为仍在ProjectB安装整个 -folder。

问题

这里的最佳做法是什么?什么是从本地来源安装ProjectA的合理配置?ProjectBProjectB

4

3 回答 3

2

如果projectA需要来自 的文件,您可以按如下projectB/lib方式配置 webpack 的解析器(假设 webpack 4):

resolve {
  alias: "projectB": "projectB/lib"
}

如果projectB是一个模块,它package.json应该包含相应的入口点(参见这个页面)。

我还建议您尝试使用yarn而不是 npm 进行包管理。Yarn 的工作区功能设计用于处理多个相互依赖的包。

于 2018-06-29T12:55:59.193 回答
0

可以尝试将以下代码放入projectB的package.json文件中吗?

"files": [
    "lib/*"
]

这应该告诉任何 npm install 只使用数组中指定的文件。您显然可以使用更多条目来扩展它们。有关更多详细信息,请参阅文档

于 2018-06-27T15:12:02.803 回答
0

您可以projectB/lib在 projectA 的 webpack 配置中使用别名。这将告诉 webpacklib在解析 projectB 模块时查看 projectB 的文件夹。

示例 webpack.config:

{
    resolve: {
        alias: {
            "projectB": path.resolve(__dirname, '../projectB/lib')
        }
    }
}

此外,如果 projectA 是将安装在另一个项目中的实用程序库,则将 projectB 设置为 projectA 的 peerDependency。这样安装 projectA 时,如果没有安装 projectB 或安装了不正确的版本,用户将收到警告。

示例 package.json:

{
    "peerDependencies": {
        "projectB": "1.0.0"
    }
}
于 2018-06-29T12:39:24.760 回答