我们这里探讨一下如何在npm install阶段,修改并编译的过程。其中涉及到一些npm的命令,一并解释和学习了。使用案例就是编译grpc。
在npm install grpc的时候会触发在package.json(grpc中的)文件中定义的scripts:
"scripts": {
"build": "node-pre-gyp build",
"coverage": "istanbul cover ./node_modules/.bin/_mocha test",
"electron-build": "node-pre-gyp configure build --runtime=electron --disturl=https://atom.io/download/atom-shell",
"install": "node-pre-gyp install --fallback-to-build --library=static_library"
}
根据npm-scripts的说明,其在打包之后会调用scripts中定义的install方法。
Tips:npm默认的install script:
"install": "node-gyp rebuild"。如果项目中有binding.gyp文件,而project并没有定义任何的install和preinstall脚本,则会默认install指令使用node-gyp进行编译。
使用--ignore-scripts,则会让npm避免执行package.json文件中的scripts脚本。而只进行打包。也就是并不进行node-pre-gyp的编译环节(针对c++源码和node的配置-binding.grp)
所以我们大体上的思路应该是:
- 先安装grpc,并不进行编译:
npm install grpc --ignore-scripts - 进入node_modules目录。进入grpc的项目。修改相关源码文件:c++源码在
deps/grpc/src/core/lib中。 - 重新build grpc:
npm run-script install grpc --fallback-to-build --library=static_library或者npm rebuild。区别在于rebuild用的是build脚本,其会重新的编译一遍c++的组件。 - 再安装其他的组件。
这里要注意一点:如果其他的组件也应用grpc,请注意保持版本的一致性。否则不会生效,他们最自己用自己的grpc版本。
或者
- 安装组件,非脚本安装:
npm install --ignore-scripts - 修改源码
- rebuild:
npm rebuild --unsafe-perm --build-from-source
使用--unsafe-perm是避免一些root用户的消息。
如果的全局安装,可以使用npm root -g找到安装路径。