当前位置: 首页 > 后端技术 > Node.js

自定义npm命令行

时间:2023-04-03 23:34:36 Node.js

入口文件,自定义依赖模块:模块通过package.json中的main字段定义了这个包对外暴露的入口;模块源自node,语法默认支持commonjs规范模块。如果使用ESModule语法编写,通过module字段定义入口(需要配合打包工具使用)自定义命令行:如果提供命令行工具,需要定义暴露的命令名和通过pkg#bin字段实际执行的文件。本文介绍自定义命令行声明、NPM依赖包,请参考链接:自定义NPM包。开发环境[]自动日志[]版本更新~使用的是husky6+,配置与老版本不同,后续文章请注意版本~husky安装npminstallhusky--save-devnpxhuskyinstallconfigurerun-script:installAutomaticallystartGithooks"prepare":"huskyinstall"afterdependency#Unix系统可用npxhuskyadd.husky/pre-commit"npmruntest"#Windows使用以下命令创建文件(引号不在windows命令行标准语法)npxhuskyadd.husky/pre-commit#在Windows环境下找到新建的文件,编辑文件,指定命令#!/bin/sh。"$(dirname"$0")/_/husky.sh"npmruntestcommitlintcommitlint提交信息校验工具需要配合校验规范使用。官网默认规范为@commitlint/config-conventional——验证规范可以自定义。npmi-Dcommitlint@commitlint/config-conventionalcommitlint绑定@commitlint/config-conventional#Unixecho"module.exports={extends:['@commitlint/config-conventional']}">commitlint.config.js#Windowsecho模块.exports={extends:['@commitlint/config-conventional']}>commitlint.config.js配置Githook:提交commitmsg时的参数验证——在run-script中写入无效#Unix系统可用npxhuskyadd.husky/commit-msg"npx--no-installcommitlint--edit$1"#Windows通过以下命令创建文件(引号在windows环境下不是标准语法)npxhuskyadd.husky/commit-msg#Windows环境查找新创建的文件,编辑文件,并指定命令#!/bin/sh。"$(dirname"$0")/_/husky.sh"npx--no-installcommitlint--edit$1standard-version安装依赖npmi--save-devstandard-version配置run-script:自动升级发布前的版本号+生成日志+提交Git"prepublishOnly":"standard-version&&gitpush--follow-tagsoriginmaster"注意:这里不要使用运行在npmi而不是npmpublish上的预发布挂钩。调试并进入本地npm包npmlink创建全局node环境的软链接在需要引入依赖包的项目A中输入npmlink创建软链接依赖命令行切换到项目A的目录结构#callnpx-hnpm包的开发是commonJS语法,使用require()代替import...from...来引入依赖。但是如果npm包语法是用ES6+语法写的,必须使用ESModule的import和export默认导出方式,不要混用。推荐几个常用的命令行辅助工具:shelljs执行脚本程序shelljs不能执行交互命令,交互会丢失还是建议child_processshelljs执行命令的输出丢失颜色可视化,可以通过相关解决方案解决。Inquirer命令行用户界面chalk命令行日志样式可以嵌套和链接Commander可以自定义命令行参数组织结构|-。husky|-bin|-actv2-use.js//单文件命令|-actv2.js//入口文件,仅用于中转|-lib|-actv2.js//主文件|-.gitignore|-.npmrc|-package.json|-README.mdpackage.json配置{"name":"actv2","version":"1.0.0","description":"","bin":"bin/actv2.js","main":"lib/actv2.js","scripts":{"prepare":"npxhuskyinstall","prepublishOnly":"standard-version&&gitpush--follow-tagsoriginmaster","test":"echo\"Error:notestspecified\"&&exit1"},"keywords":[],"author":"","license":"ISC","devDependencies":{"@commitlint/config-conventional":"^13.2.0","commitlint":"^13.2.1","husky":"^7.0.2","standard-version":"^9.3.1"},"dependencies":{"粉笔":"^4.1.2","commander":"^8.2.0","fs-extra":"^10.0.0","inquirer":"^8.2.0","shelljs":"^0.8.4"}}入口文件入口文件示例:#!/usr/bin/envnodevar{program}=require('commander')program.command('add').argument('','Addprojectmodule').option('-y,--yes','将此模块设置为部署模块').action((moduleName,options)=>{require('..')().add(moduleName,options)})program.command('use','指定部署模块').alias('u')program.option('-V,--version','查看版本').helpOption('-h,--help','查看使用帮助');program.parse(process.argv)varopts=program.opts()if(opts.version){process.stdout.write('actv2'+require('../package.json').version+'\n')}else{process.stdout.write('actv2\n'+'\n'+'Options:\n'+'--version显示版本号\n'+'--helpshowhelp\n'+'\n'+'Usage:\n'+'actv2--help\n')}其中#!/usr/bin/envnode为必填行,安装命令行后,根据行中指定的node环境执行命令行#!/bin/shbasedir=$(dirname"$(echo"$0"|sed-e's,\\,/,g')")在*CYGWIN*|*MINGW*|*MSYS*中使用`uname`)basedir=`cygpath-w"$basedir"`;;esacif[-x"$basedir/node"];然后"$basedir/node""$basedir/../actv2/bin/actv2.js""$@"ret=$?elsenode"$basedir/../actv2/bin/actv2.js""$@"ret=$?fiexit$retvs。缺少#!/usr/bin/envnode#!/bin/shbasedir=$(dirname"$(echo"$0"|sed-e's,\\,/,g')")case`uname`in*CYGWIN*|*MINGW*|*MSYS*)basedir=`cygpath-w"$basedir"`;;esac"$basedir/../actv2/lib/run.js""$@"退出$?参数解析使用commander的第三方工具包声明program.option('')//可选参数program.requiredOption()//必需参数program.requiredOption('-c,--cheese','pizza必须有奶酪');//value必填,[type]valueOptional解析program.parse(process.argv)valueprogram.opts().nameprogram.getOptionValue()子命令使用commander第三方工具包声明methodtobindthecommandstatementoftheaction命令语句只需要一个参数//例子program.command('clone[destination]')//第一行,只有一个参数.description('clonearepository进入新创建的目录').option('-y,--yes','options.yes').action((source,destination,options,command)=>{console.log('clonecommandcalled');});一个单独的可执行文件命令声明添加了一个描述参数,表示是可执行文件的声明方式#输出如下代码的文件为入口文件program.version('0.1.0').command('install[name]','installoneormorepackages')//在入口文件所在目录,搜索`<入口文件名>-install`file.command('search[query]','searchwithoptionalquery').alise('s')//在入口文件所在的目录中,搜索`<入口文件名>-search`files.command('update','updateinstalledpackages',{executableFile:'myUpdateSubCommand'})。命令('list','列出已安装的软件包',{isDefault:true});独立可执行完整示例://declarationprogram.command('use','assignmodule').alias('u')use命令定义#!/usr/bin/envnodevarchalk=require('chalk');var{program}=require('指挥官');varMessage=require('../config/messages')varcreatedFile=require('../utils/createFile')program.option('-v,--version[version]','指定版本号','0.0.3')//npx<指挥官姓名>使用-v0.0.1program.parse(process.argv)varmoduleName=program.args//获取var{version}=program.opts()if(moduleName.length!==1){process.stdout.write(chalk.redBright(Message.deployOnly)+'\n')process.exitCode=0}else{//}execute>npxactv2-hUsage:actv2[选项][命令]选项:-V,--version查看版本-h,--help查看使用帮助:actv2add[options]参数:module添加项目模块选项:-y,--yes将此模块设置为部署模块-h,--help显示命令帮助