Npm 是否将项目名称/节点模块作为符号链接?

Npm 是否将项目名称/节点模块作为符号链接?,npm,symlink,node-modules,Npm,Symlink,Node Modules,相关的: 如果npm install-g不推荐所有内容,并且我不想链接单个模块,我是否可以将/node\u模块符号链接到一个公共目录以供多个项目共享?node可以很好地处理符号链接。如何实现这一点将取决于您的一些目标。最重要的是:对于从版本控制下载您的项目的其他开发人员,您希望他们有什么样的经验 在设计此体验时,阅读节点模块加载算法非常有帮助,可以深入了解可能的情况 一般来说,我的建议是不要关注项目之间重复的依赖关系。“修复”这不值得维护成本,维护成本包括依赖性僵局(子项目的需求冲突)以

相关的:


如果
npm install-g
不推荐所有内容,并且我不想链接单个模块,我是否可以将
/node\u模块
符号链接到一个公共目录以供多个项目共享?

node可以很好地处理符号链接。如何实现这一点将取决于您的一些目标。最重要的是:对于从版本控制下载您的项目的其他开发人员,您希望他们有什么样的经验

在设计此体验时,阅读节点模块加载算法非常有帮助,可以深入了解可能的情况

一般来说,我的建议是不要关注项目之间重复的依赖关系。“修复”这不值得维护成本,维护成本包括依赖性僵局(子项目的需求冲突)以及在某些情况下需要自定义工具来解释自定义结构

有了这个警告,我们该怎么做?最简单的方法是创建一个封装各种子项目的超级项目。子项目将有效地继承超级项目的依赖关系

superproject/
|-- node_modules/
|   +-- socket.io/
|-- package.json
|-- subprojectA/
|   |-- node_modules/
|   |   +-- browserify/
|   |-- package.json
|   +-- app/
|       +-- client.js
+-- subprojectB/
    |-- node_modules/
    |   +-- express/
    |-- package.json
    +-- lib/
        +-- server.js
此结构的工作方式与您预期的相同,子项目中的文件可以
require()
它们自己的模块和
superproject/node_模块中的任何模块
,但它们不容易
require()
它们的同级子项目中的模块(仍然可以通过显式路径执行)。换句话说,client.js可以
require()
browserify和socket.io,但它需要使用
require()
express的路径


其中一个重要方面是,
npm
对package.json进行“查找”搜索,并在安装时将
node\u modules
目录中的模块作为该文件的同级处理,等等。这意味着您当前的工作目录需要是
superproject
,以便在其中安装模块,除非您的子项目没有
package.json
文件。

否则“重复依赖项”是一个巨大的问题,因为即使对于非常小的项目,这些文件也会占用相当多的空间,并且在设置正在使用(大部分)的新项目时也会间接浪费带宽同样的依赖。我能理解这些欲望。但我想你会发现,以这种方式紧密耦合各种项目会产生不同的负担。因为project x需要某种行为,所以无法更新依赖项。但是您确实想要/需要更新它,因为project y正在以不同的方式使用它,并且需要一些新的东西。在过去,所有npm模块都是全球性的,这种做法停止了,因为社区意识到它不值得。尽管如此,仍然有办法实现伪全局模块。超级项目是一个出色的解决方案!谢谢。在我的例子中,我正在处理几个LaravelPHP项目,这些项目使用node来完成仅用于开发的任务(gulp)。Gulp和require()只在本地安装时才起作用,但是为每个5MB PHP项目复制200MB的node_模块是完全不合理的,特别是因为我自己没有做任何节点开发。超级项目是我找到的唯一合理的解决方案:我可以拥有一个laravel-5.2文件夹,其中包含5.2所需工具的一个副本,以及所有5.2项目,等等。太棒了@SethHolladay人已经面临这个问题,并且在操作系统开发史上已经成功地解决了这个问题。在任何操作系统中都有数百个(如果不是数千个)共享库,同一个库的多个不同版本可以通过使用一个简单的规则愉快地共存——将版本包含在库的名称中。因此,聪明的开发人员应该使用
node\u模块/包的约定_name@MajorVersion.MinorVersion.BuildNumber/js
这样我们就不必与墙抗争了……
node_模块
作为一个符号链接应该可以很好地工作。我还没有专门测试过这个,但如果它不起作用,那听起来像个bug。我不知道有任何设计选择或限制会对
node\u模块
不能是符号链接施加约束。也就是说,也许npm是在天真地抨击它。至于“检查package.json是加载程序的工作”,那就好了。不幸的是,事实并非如此。不过,这听起来是一个不错的解决方案,而且有可能在userland中实现。