如果感兴趣,你可以把自己积累的函数库或者工具,放到 npm 上,然后安装到自己电脑终端,这样就可以很酷的使用了,我之前就把常用的一些项目脚手架模版 放到了公司的内网 npm 上,这篇文章就来介绍下如何发布和搭建一个npm 工具包。
发布 npm 包的流程
这里以私库为例
-
配置私库 registry:
npm config set @vipabc:registry http://npm.registry.*****.com/
-
npm login --registry=http://npm.registry.*****.com.cn/ --scope=@itutorgroup
(之后按提示完成即可)或者:npm adduser --registry=http://npm.registry.*****.com.cn/ --always-auth
-
发布包:
npm publish
(需要在package.json里指定包名为:”name”: “@*****/templateName”) -
取消发布包:
npm unpublish [<@scope>/]<pkg>[@<version>]
// 好像只能取消 24 小时内发布的包
使用方式:
这里以自己写的 crm-li
为例
- 如果是公司的内网 npm,首先要切换源
npm i crm-cli -g
- 查看版本
crm --version / V
- 查看所有指令
crm -help / h
- 查看模版列表
crm list
- 基于 a 模板进行初始化
crm init a project-name
一个npm 脚手架模版的写法
效果图
核心 node 代码部分
讲解放到注释部分了
#!/usr/bin/env node
// 使用node开发命令行工具所执行的Javascript脚本必须在顶部加入 #!/usr/bin/env node 声明
const program = require('commander') // node 命令行处理工具?
const handlebars = require('handlebars') // 模板引擎处理字符串
const inquirer = require('inquirer') // 使用此模块可与命令行进行交互
const fs = require('fs') // Node.js内置的fs模块就是文件系统模块,负责读写文件
const ora = require('ora') // ora包用于显示加载中的效果,类似于前端页面的loading效果
const chalk = require('chalk') // 用于改变控制台中字符串到样式
const logSymbols = require('log-symbols')
const download = require('download-git-repo') // 下载 git 仓库代码 ?
const templates = require('./config')
// 1.获取用户输入命令
program.version('1.0.1')
program
.command('init <template> <project>')
.description('初始化项目模板')
.action(function (templateName, projectName) {
/**
* 根据模板名下载对应的模板到本地
* 下载之前做 loading 提示
*/
const spinner = ora('正在下载模板...')
spinner.start()
/**
* 第一个参数: 仓库地址
* 第二个参数: 下载路径
*/
const { downloadUrl } = templates[templateName]
download(downloadUrl, projectName, { clone: true }, (err) => {
if (err) {
spinner.fail('下载模板失败') // 下载失败提示
console.log(logSymbols.error, chalk.red('初始化模板失败' + err))
return false
}
spinner.succeed('下载模板成功') // 下载成功提示
/**
* 把项目下的 package.json 文件读取出来
* 使用向导的方式采集用户输入的值
* 使用模板引擎吧用户输入的数据解析到 package.json 文件中
* 解析完毕,把解析之后的结果重新写入 package.json 文件中
*/
inquirer
.prompt([
{
type: 'input',
name: 'name',
message: '请输入项目名称:',
},
{
type: 'input',
name: 'description',
message: '请输入项目简介:',
},
{
type: 'input',
name: 'author',
message: '请输入作者名称:',
},
])
.then((answers) => {
// 把采集到的用户输入的数据解析替换到 package.json 文件中
const packagePath = `${projectName}/package.json`
const packageContent = fs.readFileSync(packagePath, 'utf8')
const packageResult = handlebars.compile(packageContent)(answers)
fs.writeFileSync(packagePath, packageResult)
console.log(logSymbols.success, chalk.yellow('初始化模板成功'))
})
})
})
program
.command('list')
.description('查看所有可用模板')
.action(() => {
// 根据模板名下载对应的模板到本地并起名projectName
console.log('模板列表:')
for (let key in templates) {
console.log(`${templates[key].name} ${templates[key].description}`)
}
})
program.parse(process.argv)
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END