Node.js 如果您指向符号链接,则require会出错

Node.js 如果您指向符号链接,则require会出错,node.js,git,requirejs,Node.js,Git,Requirejs,我正在尝试在我的nodejs项目中创建一个插件文件夹 / --/plugins ----index.js plugins文件夹有一个index.js文件,该文件将动态“加载”该目录中的所有插件 我创建了一个foo模块 / --/plugins ----index.js ----/foo (foo plugin stuff all in this dir) 这一切都很好。现在我想将foo插件移动到另一个git repo中。这个想法是,当你拉核心项目时,默认情况下你不会得到任何插

我正在尝试在我的nodejs项目中创建一个插件文件夹

/
 --/plugins
 ----index.js
plugins文件夹有一个index.js文件,该文件将动态“加载”该目录中的所有插件

我创建了一个foo模块

/
  --/plugins
  ----index.js
  ----/foo (foo plugin stuff all in this dir)
这一切都很好。现在我想将foo插件移动到另一个git repo中。这个想法是,当你拉核心项目时,默认情况下你不会得到任何插件。但是你可以通过把你想要的东西放到插件目录中来“安装”它们

所以我在git中将plugins dir保留为空,我在与core不同的目录中签出一个插件,这样git就不会将其视为一个更改。然后我将插件符号链接到插件目录

这就是我开始遇到问题的地方。如果我从我的foo插件中引用了我的核心项目中的模块:

var someCoreModule = require('../core/someModule');
如果它来自'/plugins/foo/someFoo.js',它会从插件在文件系统中的实际位置,而不是从符号链接所在的位置,向上移动一个目录。从nodejs的角度来看,这似乎是正确的结果

问题是,我怎样才能把一些东西放到我的插件目录中,它本身就是一个git repo,但不让主服务器repo跟踪“plugin”repo


我想我可以用git ignore做点什么,但我想知道对于这种简单的插件架构是否有更优雅的解决方案。

我在node中实现插件模式的方法是使用package.json中的字段。这允许我向npm发布一个核心包,以及将核心包作为对等依赖项列出的插件包

对等依赖项必须并排安装,而不是嵌套在包的node_modules目录中。不确定这是否有助于解决您的具体情况,但如果您不想发布到npm,我认为它比符号链接或git子模块等更优雅

看看我的包的package.json文件。它将我的核心模块列为对等依赖项。如果用户运行npm install shotgun client,他们还将与它并排安装shotgun。因此,与此相反:

/
  --/node_modules
  ----/shotgun-client
  ------/node_modules
  --------/shotgun
你会得到这样的结果:

/
  --/node_modules
  ----/shotgun-client
  ----/shotgun
通过这样做,您可以始终确保目录结构。您只需向上一级进入安装它们的node_modules文件夹,然后返回到您的核心包或任何插件包中

另外,npm安装一些插件而不是git克隆一些插件repo url,然后将其符号链接到插件目录,这是一种更酷的方式。我认为前者更直观:


此外,消除符号链接的需要将使您的软件包在Windows上工作不会有问题。

非常感谢您的回复,我不知道存在对等依赖关系。但就我而言,我不确定这就是我所追求的。我真的很想把一个模块放到一个特定的文件夹中,然后让它“安装”。对于对等依赖关系,我必须在我的应用程序文件中指定每个插件,因为它们与我的核心服务器不在同一个文件夹中,而是在同一个目录中。你的回答也让我相信符号链接可以在unix系统上工作。然而,我发现这不是真的,因为当我尝试从插件“../foo”请求一个存在于我的核心服务器中的模块时,require无法找到它,因为require从插件目录而不是symlinked目录上升了一个目录。我不确定require和symlinks之间的细微差别。我不太明白你说的对等依赖设置是什么意思。我加载shotgun插件所要做的就是从shotgun所在的目录向上移动一个目录,这通常是安装了shotgun的任何项目的节点\ U模块。然后,我在该目录中搜索以shotgun-开头的所有目录,这是我用来识别shotgun插件的惯例;虽然如果我不希望命名约定严格,那可能是package.json元数据:所以在我的设置中,这很像插入插件。除了我把它们和散弹枪并排放在节点_模块中,散弹枪知道在那里寻找它们。这样做的另一个好处是,npm可以安装shotgun插件,只需将插件放入node_modules文件夹中,同时确保已安装主软件包: