🚁一起来封装脚手架吧![第5天:NPM包的发布]

448 阅读3分钟

👽 概论

脚手架开发完成之后,当然得发布到NPM上啊(不要问我为什么)。今天我们就来着重讲讲如何发布包至NPM(在这块之前会为脚手架增加两个小功能:远程仓库创建 + 依赖下载,不感兴趣的可以直接跳到发包的章节)。

👽 远程仓库创建

项目模板生成之后,很多时候我们会同步创建项目的远程仓库,然后上传项目模板并将仓库地址共享给团队伙伴。这一过程繁琐且毫无技术含量,那就交给代码自动执行吧!

🚩 配置交互项

首先确认用户需不需要自动生成远程仓库:

 /*
 * @FileName: prompts.js
 * @Description:交互项
 */
const chalk = require('chalk');

const PROMPTS = (isFile, appName) => {
  return {
    ···
    needCreateRepo: {
      name: 'needCreateRepo',
      type: 'confirm',
      message: `是否需要创建远程仓库:`,
    },
    },
  };
};
module.exports = PROMPTS;

🚩 定义远程仓库生成工具

此处主要用shelljs库来在node中调用git的repo创建命令:

 /*
 * @FileName: createRepo.js
 * @Description:创建远程仓库
 */

const shell = require('shelljs');

async function createRepo(appName, repoUrl) {
  // 拼接待创建仓库地址
  const projectUrl = `${repoUrl}/${appName}.git`;
  // 执行git命令
  const info = shell.exec(`git push --set-upstream ${projectUrl} master`);

  // 输出结果
  if (info.stdout) {
    await clearConsole('green', `** 远程仓库创建成功:${projectUrl} **`);
  } else {
    await clearConsole('red', `** 远程仓库创建失败 **`);
  }
}

module.exports = createRepo;

🚩 主逻辑中引入此功能

/*
* @FileName: create.js
* @Description:cli-create命令
*/
···

const generateFile = require('../utils/generateFile');

async function create(appName) {
 ···
 // 切换至项目目录
 shell.cd(appName);

 const { needCreateRepo } = await inquirer.prompt(newPrompts['needCreateRepo']);
 // 定义仓库地址
 const repoUrl = `http://xxx/front`;
 // 选‘是’时执行代码
 needCreateRepo && createRepo(appName, repoUrl);
}
···

👽 依赖下载

同样的思路我们来做下依赖下载功能。

配置交互项

 /*
 * @FileName: prompts.js
 * @Description:交互项
 */
const chalk = require('chalk');

const PROMPTS = (isFile, appName) => {
  return {
    ···
    needInstallPackages: {
      name: 'needInstallPackages',
      type: 'confirm',
      message: `是否需要下载项目依赖:`,
    },
  };
};
module.exports = PROMPTS;

🚩 定义依赖下载工具

 /*
 * @FileName: installPackages.js
 * @Description:依赖下载
 */
const shell = require('shelljs');
const chalk = require('chalk');

async function installPackages() {
  console.log(chalk.yellow('即将开始下载项目依赖'));
  // 这里默认使用了yarn,也可以做成让用户决定用那种包管理器
  const info = shell.exec(`yarn`);

  // 判断结果
  if (info.stdout) {
    await clearConsole('green', `** 依赖下载成功 **`);
  } else {
    await clearConsole('red', `** 依赖下载失败 **`);
  }
}

module.exports = installPackages;

🚩 主逻辑中引入此功能

/*
* @FileName: create.js
* @Description:cli-create命令
*/
···

const generateFile = require('../utils/generateFile');

async function create(appName) {
 ···
 // 目前仅web项目需要下载依赖
 if (appType === 'web') {
   const { needInstallPackages } = await inquirer.prompt(newPrompts['needInstallPackages']);
   needInstallPackages && installPackages();
 }
}
···

👽 NPM包的发布

这部分其实更简单,发布时切记NPM源必须为官方源(https://registry.npmjs.org/):

🚩 首先请在NPM官网注册一个NPM账号,记住你的用户名以及密码。

🚩 执行命令npm adduser,依次输入用户名、密码以及邮箱。

🚩 执行命令npm publish发布NPM包,完成!

🚩 全局安装你的NPM包后,就可以正常使用脚手架命令啦(记得先执行npm unlink解除关联)!

👽 附注

欢迎查看脚手架源码,或下载NPM包体验: npm i V9-cli -g

👽 ‘一起来封装脚手架’系列文章

🚁第1天:脚手架模板的构思

🚁第2天:项目规范的定义

🚁第3天:脚手架开发的前置知识

🚁第4天:看完必会的脚手架开发!

🚁第5天:NPM包的发布