【问题标题】:Is it possible to have a node_modules directory shared between projects是否可以在项目之间共享 node_modules 目录
【发布时间】:2015-07-13 16:44:37
【问题描述】:

我的项目设置如下:

workspace
└cache
  └node_modules
    └gulp (and gulp-plugins, express etc.)
└nodejs
  └node.exe
└project1
  └gulpfile.js
└project2
  └gulpfile.js

现在我要执行项目目录下的gulpfile:

set NODE_PATH='C:\workspace\cache\node_modules\'
cd C:\workspace\project1\
C:\workspace\nodejs\node.exe C:\workspace\cache\node_modules\gulp\bin\gulp.js watch

我得到以下输出:

[12:06:04] Local gulp not found in C:\workspace\project1
[12:06:04] Try running: npm install gulp

在两个项目文件夹中,gulpfile 是相似的,并且使用了一组相似的插件。我真的很想只拥有一次依赖项(因为我可能有多达 25 个项目共享相同的 node_modules)。 这种设置是否可行,或者单独的项目目录是否需要有自己的 node_modules 文件夹?

【问题讨论】:

    标签: node.js gulp


    【解决方案1】:

    Gulp 要求您同时拥有全局安装和本地安装。所以你需要让你的 Gulp 相对于你的 Gulpfile。如果您的package.json 将位于workspace 并且您的node_modules 将在workspace/node_modules 中,那么由于Node 的搜索树,一切都会正常工作,但是如果您无法移动它们,那么使其工作的唯一方法是“伪造”node_modules 文件夹。

    您可以通过创建符号链接来做到这一点。

    这是在 Unix/Linux/Mac 上:

    ln -s ../cache/node_modules node_modules
    

    这是在 Windows 上

    mklink /D node_modules ../cache/node_modules
    

    (后一种可能工作方式不同,我不在Win机器上)

    【讨论】:

    • 其实你不需要全局安装gulp,你只需要命令行工具。我使用的命令(带有 node.exe 和 gulp.js 的完整路径)是为了防止必须使用全局安装的 gulp。此方法适用于 Windows 上的以下 createlink 命令:mklink /J node_modules ..\SFBC\node_modules 记录在案;我把头撞在桌子上,因为我自己没有想到这一点。来自 Linux/Mac 环境,我不习惯在 windows 中应用相同的方法。
    【解决方案2】:

    你也可以试试pkglink

    来自描述:

    节省空间的 Node.js 包硬链接器。 pkglink 从您的 node_modules 目录中找到常见的 JavaScript/Node.js 包,并硬链接包文件,以便它们共享磁盘空间。

    【讨论】:

      【解决方案3】:

      编辑:ddprt

      在 Windows 上

      mklink /D node_modules "C:/fullPATH/cache/node_modules"
      

      【讨论】:

        【解决方案4】:

        您始终可以在 npm install 'package-name' 中使用 '-g' 参数,以便使模块在全局范围内可用于跨不同项目访问。

        查看以下链接

        1. what does the "-g" flag do in the command "npm install -g <something>"?
        2. How do I install a module globally using npm?
        3. https://docs.npmjs.com/files/folders

        包被放到前缀下的 node_modules 文件夹中。在本地安装时,这意味着你可以 require("packagename") 加载它的主模块,或者 require("packagename/lib/path/to/sub/module") 加载其他模块。

        Unix 系统上的全局安装转到 {prefix}/lib/node_modules。 Windows 上的全局安装转到 {prefix}/node_modules(即,没有 lib 文件夹。)

        作用域包的安装方式相同,只是它们是分组的 一起在相关 node_modules 文件夹的子文件夹中 该范围前缀的名称由 @ 符号,例如npm 安装 @myorg/package 会将包放入 {prefix}/node_modules/@myorg/package.

        【讨论】:

        • Gulp 需要本地和全局安装。这是他们工具过程的一部分。
        • 感谢您的链接。也许我必须更明确地说明我在这里不使用全局安装的 gulp,而只使用本地安装的 gulp。这就是问题命令中完整路径名的原因。