设想

  • 我正在使用npm 5.8.0
  • 我正在使用ProjectAProjectB
  • ProjectBProjectA的依赖项
  • 两个项目都已捆绑并通过Webpack运行(如果需要,我可以提供配置)。

  • 出于开发目的,我通过ProjectB引用了ProjectA的package.json中的"projectB": "file:../projectB"。基本上,我只需要在Webpack的输出lib文件夹中找到文件。

    问题

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

    除了这不是预期的行为外,还会导致错误。例如,某些已安装的@types将引发错误,因为它们被视为重复项。 @types和ProjectAProjectB中的其他软件包似乎“冲突”。这些软件包大多在"dependencies"ProjectA中都被称为ProjectB

    我尝试了什么

    npm连结

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

    npm包

    我实际上确实在.npmignore中有一个ProjectB-文件,这可能是重要的。因此,当我使用npm pack时,会生成一个projectB.tgz文件。如果我随后通过ProjectB安装"projectB": "file:../projectB.tgz",则一切正常。我假设npm pack确实考虑了.npmignore -file。

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

    删除ProjectB的node_modules

    我猜这是最愚蠢的解决方法。如果我再次通过ProjectB引用了"projectB": "file:../projectB",但在构建后删除了它的node_modules,则它们在安装后不会出现。因此,我再也没有异常(exception)了。

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

    问题

    这里的最佳做法是什么?为了从本地源安装ProjectA,对ProjectBProjectB的合理构想是什么?

    最佳答案

    如果projectA需要projectB/lib中的文件,则可以按以下方式配置webpack的resolver(假设为webpack 4):

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

    如果projectB是一个模块,则它的package.json应该包括相应的入口点(请参阅this page)。

    我还建议您尝试使用yarn而不是npm进行软件包管理。 Yarn的workspaces功能旨在与多个相互依赖的程序包一起使用。

    关于npm - 本地项目的 `npm install`出现异常行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49597204/

    10-11 23:50