Nodejs:多个项目工作stream程
假设你有这个设置:
root project1 package.json { "version" : "0.0.1" } project2 package.json { "version" : "0.0.1", "dependencies" : { "project1" : "^0.0.1"] } main package.json ("dependencies" : { "project1" : "^0.0.1" }
Project1,project2,projectXxxx …和main必须一起改变。 它们都可能一直 都在变化 (几乎不可能在没有依赖项目1,项目2等的情况下实现任何东西)这不是一个很less更改的库的情况。
你如何避免这两个陷阱:
-
你可以在本地使用'npm link'。 但是,每个开发者都必须按照正确的顺序在所有项目中手动调用“npm链接”。 新开发人员(或刚刚签出新开发分支的人)的工作stream程是:
- CD主
- npm安装
- 得到一个错误,因为project2丢失
- npm链接../project2
- 得到一个错误,因为project1丢失
- cd ../project2
- npm链接../project1
- npm安装
- CD主
- npm安装
让它超过两个项目,这是疯狂的。
- 或者您可以使用“预安装”脚本来为您执行“npm链接”(正如许多其他SO问题所build议的),但实际上,您不能,因为文档告诉您不要使用预安装脚本: https:/ /www.npmjs.org/doc/scripts.html
tl; dr不要使用安装。 使用.gyp文件进行编译,并预先发布其他任何内容。
您几乎不需要明确设置预安装或安装脚本。 如果你正在这样做,请考虑是否有其他select。
安装或预安装脚本的唯一有效用途是编译,必须在目标架构上完成。
-
或者,您可以将每个模块发布到一个私有存储库,每次你改变一些东西。 工作stream程(据我所知):
- 编辑project1中的文件
- 凹凸版本
- npm发布project1
- 回到project2
- npm安装
- 编辑
- npm发布project1
- 回到主要
- npm安装
- 编辑
- 意识到你犯了一个错误,并重新开始。 疯狂也是。
正如你所看到的,没有一个是可以接受的。
那么你会改变什么来获得一个合理的工作stream程?
你把所有的东西放在同一个项目中吗? (可悲的是,对我来说这是不可接受的,因为别的项目也会需要project1。)
我错过了一个'npm xxxxx'命令吗?
谢谢
这听起来像什么通常是轻微的滋扰正在成为你的主要问题,因为你的项目devise还没有实现松耦合。 基本上,我认为你有一种代码味道,在某种forms或另一种主要的,project1和project2实际上仍然是一个单一的应用程序,应该是一个单一的模块,或project1不是正确的抽象,因此可以拆分和使用MAIN2。 继续重构它,并在某个时刻,你会有一个灯泡的时刻,并find一个更清洁的组织。
不过,同时,我也有一个build议,对你有所帮助。 当我处于类似的情况时,我们把所有的helper模块作为单独的项目放在他们自己的私有github仓库中,当一个新的开发者克隆了main时,我们有一个shell脚本来设置下面的结构,其中的关键是node_modules
一个比正常高的目录:
ROOT main project1 project2 node_modules project1 (symlink to ../project1) project2 {symlink to ../project2)
这允许两种开发模式:
-
cd main && npm install
会让你进入正常模式,并且会像往常一样在ROOT/main/node_modules/project1
安装兄弟项目- 当主要工作时使用这个
- 在提交
main/package.json
更新之前进行最终testing时也要使用它
-
cd main && rm -rf node_modules/project[12]
会使您处于同步开发模式- 当
main
中的代码require("project1")
它会从本地ROOT/node_modules/project1
符号链接中find它,并且可以在任何项目中快速编辑代码。 无需缓冲版本号,推送提交,或npm安装任何东西来testing更改。 - 完成后,
cd main && npm install
会让你回到正常模式
- 当
由于使用符号链接,这可能不适用于Windows,FYI。
你可以编写一个main
脚本的shell脚本,开发人员可以在第一次克隆main
repo时运行这个脚本来设置这个结构。
- 使用Express.JS发送额外的http标题
- 将多个元素添加到所有相同的数组中
- 模块针对浏览器和nodejs模式
- CSRF禁止在我的registry上,不知道为什么
- 我怎样才能debugging节点模块?
- 我怎样才能使用蓝鸟Promiseify节点的游标和/或集合'toArray()mongodb模块?
- 在Javascript中转义错误信息
- 模块构build失败:ReferenceError: /app/src/index.js:未知选项:/app/node_modules/react/react.js.Children
- 蓝鸟promisify与promisifyAll性能比较当想从模块promisification一个方法