npm之package.json解析并执行

camillalo

About npm?

世界上最大的软件registry。所有的开源开发者使用npm进行share和borrow包,很多组织也会用npm来管理私有的development。

npm 包含三个distinct components(不同的组成部分):

  • websites: 用来查找开源的包
  • the Command Line Interface(CLI):用于与npm服务器交互的终端,常用语developers当中
  • the registry: 一个大的Javascript软件的公共数据库,以及相关的原信息(meta-infomation)

参考 LINK

.npmignore

放在根目录或子目录下,用来避免指定文件被包含。

  • 放在根目录下,package.json中的files字段不会被override,放在子目录中,会覆盖files字段。
  • 工作方式同.gitignore,如果已经有.gitignore,且没有.npmignore,那么.gitignore中内容将会被应用
  • package.json#files中列举的files不能被.npmignore or .gitignore exclude(避免)

特定的文件总是会被included,不管你是不是在files中设置了:

  • package.json
  • README 【任意后缀,任意大小写】
  • CHANGES / CHANGELOG / HISTORY
  • LICENSE / LICENCE
  • NOTICE
  • The file in the "main" field【package.json中main字段指向的入口文件】

相反地,以下文件常常是会被设置为ignore的

.git
CVS
.svn
.hg
.lock-wscript
.wafpickle-N
.*.swp
.DS_Store
._*
npm-debug.log
.npmrc
node_modules
config.gypi
*.orig
package-lock.json (use shrinkwrap instead)

package.json组成

package发布到registry必须包含package.json文件,目的:为了让其他人更易管理及安装使用。

包含:

  • lists列举出你项目以来的所有包,包括开发依赖:devDependencies, 生产依赖:dependencies。
  • 指定出你的项目中使用语义化版本规则时候需要的特定包版本
  • makes your build reproducible, and therefore easier to share with other developers(使您的构建具有可重复性,因此更易于与其他开发人员共享)
  • 其他描述信息,如:description描述:让你的包在website中更容易被检索到

配置并使用环境变量vars

package.json中的字段都会被npm_package_前缀后,成为环境变量,如:npm_package_name, npm_package_version

// 配置port
“config”: { "port": 8080 }
// 然后,通过npm执行后运行脚本,程序所在的runtime就能访问到这个npm变量了,如:
console.log(process.env.npm_package_config_port); // 8080
// 如果此时发现8080端口被占用了,在不修改package.json文件的前提下,怎么修改端口呢?在项目路径下终端修改(需指定项目name)
npm config set my_project_name:port 9090
// 查看全局变量
console.log(process.env); // {...}
// 如果不指定项目名称,npm配置后前缀为npm_config
npm config set color false
// 查看
npm config get color // false
// 访问
console.log(process.env.npm_config_color); // false

可配属性

如下图:
npm.png

npm如何处理scripts?

npm run-script <command> [--silent] [-- <args>...]
alias: npm run
##如果没有传 command, 就会列出当前项目下所有可用的scripts
##并区分为:lifecycle(test, start, restart), directly-run scripts(常见的自定义那些)

*参数
##在npm@2.0.0中,你可以在计算脚本的时候使用自定义参数。使用特殊的选项 ‘--’ 来分隔:
npm run test -- --grep="red"

npm原理

当执行npm run,就会自动创建一个shell脚本,在shell里面执行指定的脚本命令,所以:只要是环境中shell可以运行的命令,都可以写在npm的scripts中,作为参数什么的传递也行。参考

特别: npm run 新建的这个shell, 会将当前目录的node_modules/.bin 子目录加入PATH 变量,执行结束后,再将PATH变量恢复原样。还意味着,当前目录的node_modules/.bin 子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有Mocha, 只要直接写 mocha  test 就可以了。

"test": "mocha test"

而不用写成下面这样。

"test": "./node\_modules/.bin/mocha test"

由于npm脚本的唯一要求就是可以在shell中执行,因此它不一定是Node脚本,任何可执行文件都可以写在里面。npm脚本的退出码,也遵守shell脚本规则。如果退出码不是0,npm 就认为这个脚本执行失败。

阅读 1.4k
4 声望
0 粉丝
0 条评论
4 声望
0 粉丝
文章目录
宣传栏