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如何处理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 就认为这个脚本执行失败。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。