npm 全局安装vuecli报错_前端脚手架CLI生成模版命令工具(包括,npm包的发布,脚手架的搭建,注意事项,优化等)...

NodeJs的出现,让前端工程化的理念不断深入,正在向正规军靠近。先是带来了Gulp、Webpack等强大的构建工具,随后又出现了vue-cli和create-react-app等完善的脚手架,提供了完整的项目架构,让我们可以更多的关注业务,而不必在项目基础设施上花费大量时间。

平时我们都只专注在业务上的开发,拿起一套开箱即用的模板项目就直接干。但是,这些现成的脚手架未必就能满足我们的业务需求,也未必是最佳实践,这时我们就可以自己开发一个脚手架,那么我们使用的脚手架里面到底做了什么,如何自己搭建脚手架呢?

脚手架代码github地址:https://github.com/hourong88/portal-cli

点击文章末尾,【阅读原文】即可访问

以下为正文,文章结构:

d2906300f11950004afea05ebfd6dddb.png

提问

1.脚手架需要实现什么?

初始化项目模版能力。

2.脚手架需要什么功能?

  1. 问询功能
  2. 下载模版(模版与脚手架分离,互不影响)
  3. 写入模版
  4. 优化(git初始化,安装依赖等)

3.用什么工具实现?

  • commander.js 命令行工具
  • chalk 命令行输出样式美化
  • Inquirer.js 命令行交互

当然还有,download-git-repo git仓库代码下载,ora 命令行加载中效果等优化依赖工具,都可以在此基础上,进行丰富。

以下分为两步完成:

  1. 本地创建cli脚手架并测试 ;
  2. 发布脚手架

我们正常的流程是创建本地脚手架,绑定git仓库,发布包,从易到难,我们反过来,本文先讲怎么发一个最简单的npm包,然后把脚手架搭好了,走一遍发包流程,就OK了。

一、发布npm包

本地创建项目

首先,我们需要创建一个项目,这里就叫portal-cli, 项目结构如下:

- commands  // 此文件夹用于放置自定义命令
- utils
- index.js  // 项目入口
- readme.md

为了测试,我们先在index.js放点内容:

#!/usr/bin/env node
// 必须在文件头添加如上内容指定运行环境为node
console.log('hello cli');

对于一般的nodejs项目,我们直接使用node index.js就可以了,但是这里是脚手架,肯定不能这样。我们需要把项目发布到npm,用户进行全局安装,然后就可以直接使用我们自定义的命令,类似portal-cli这样。

所以,我们需要将我们的项目做下改动,首先在package.json中添加如下内容:

 "bin": {
    "portal-cli": "index.js"
  },

这样就可以将portal-cli定义为一个命令了,但此时仅仅只能在项目中使用,还不能作为全局命令使用,这里我们需要使用npm link将其链接到全局命令,执行成功后在你的全局node_modules目录下可以找到相应文件。然后输入命令测试一下,如果出现如下内容说明第一步已经成功一大半了:

anna@annadeMacBook-Air job % > portal-cli
 hello cli

*如果全局有bin相同名字的,会报错,需要把package.json里面bin起的名字修改一下

发布npm包注意事项:

  1. npm官网注册一个npm账户,已有账户的可以跳过这一步
  2. 使用npm login登录,需要输入usernamepasswordemail
  3. npm whoami 检查自己是否成功登陆
  4. npm link本地调试,上面已经调试的,跳过这一步
  5. 使用npm publish发布
  6. 每次发布npm包,都要修改版本号
//npm publish报错
npm notice integrity:     sha512-Jkfy0M/VyAkQb[...]B9Ifdw2hF2CGQ==
npm notice total files:   7                                       
npm notice 
npm ERR! code E403
npm ERR! 403 403 Forbidden - PUT http://registry.npmjs.org/portal-portal-cli-hourong - Forbidden
npm ERR! 403 In most cases, you or one of your dependencies are requesting
npm ERR! 403 a package version that is forbidden by your security policy.

我发布包的时候,调整了几次,报错,不是403就是404,那个捉急。下面总结了几个报错检查清单:

  1. 检查npm包的名字跟已有的包名是否重复,要么就改个名字,或者加后缀
  2. 如果用的是cnpm源,要改成npm,方法见下面说明registry
  3. 如果还是报403,你的账号看是不是刚刚注册的,如果是的话,需要进入你的邮箱,验证一下邮箱。
  4. 版本号是否更新
  5. 如果以上3步修改了,还是报403错误,就连接手机4g热点再发布一下。

一般发布不了,按照以上5点进行检查,可以解决。

检查第2步npm源的方法

查看本地当前使用的源

registry npm config get registry

切换源

registry npm config set registry

临时切换

registry npm publish --registry

设置完以后,再次查看当前源是否是http://registry.npmjs.org

注意:国内目前发布组件时,必须切换为npmjs,否则npm publish也不会成功

**************

科普npm registry

简单来说,npm registry就相当于一个包注册管理中心。它管理着全世界的开发者们发布上来的各种插件,同时开发者们可以通过npm install的方式安装所需要的插件。

npm官方registry为:http://registry.npmjs.org/

国内速度较快的为:https://registry.npm.taobao.org/

**************

以上涉及到的关键命令:

npm link  // 本地调试
npm publish  // 发布
npm whoami  //查看当前登陆的用户名

每次更新包需要同步更新版本号,发布的包需要发布72小时以后才可以废弃删除。

二、本地脚手架搭建

上文中,我们既然是搭建脚手架,肯定不能只让它输出一段文字吧,我们还需要定义一些命令,用户在命令行输入这些命令和参数,脚手架会做出对应的操作。这里不需要我们自己去解析这些输入的命令和参数,有现成的轮子commander可以使用,完全可以满足我们的需要。

  1. 安装commander

npm install chalk commander download-git-repo inquirer ora --save

  1. 创建目录 bin/index.js
  2. package.json 里面bin改为
  "bin": {
    "portal-cli": "bin/index.js"
  },

当然目录结构你可以随意定义,package.json里面bin从哪里起,主要文件就放哪儿。

  1. 创建commander init命令
#!/usr/bin/env node

const fs = require('fs');
const path = require('path');
const chalk = require('chalk'); //命令行输出样式美化
const commander = require('commander'); //命令行工具
const inquirer = require('inquirer'); //命令行交互
const checkDire = require('./utils/checkDire.js');
const { exec } = require('child_process');
const { version } = require('../package.json');
const { promptTypeList } = require('./config');

function resolve(dir) {
  return path.join(__dirname,'..',dir);
}

//version 版本号
commander.version(version, '-v, --version')
  .command('init ')
  .alias("i")
  .description("输入项目名称,初始化项目模版")
  .action(async (projectName,cmd) => {
    await checkDire(path.join(process.cwd(),projectName),projectName);   // 检测创建项目文件夹是否存在
    inquirer.prompt(promptTypeList).then(result => { //inquirer 交互问答
      const {url, gitName, val} = result.type;
      console.log("您选择的模版类型信息如下:" + val);
      console.log('项目初始化拷贝获取中...');
      if(!url){
        console.log(chalk.red(`${val} 该类型暂不支持...`));
        process.exit(1);
      }
      exec('git clone ' + url, function (error, stdout, stderr) {  //git仓库代码下载
        if (error !== null) {
          console.log(chalk.red(
            `clone fail,${error}`
          ));
          return;
        }
        fs.rename(gitName, projectName, (err)=>{
          if (err) {
            exec('rm -rf '+gitName, function (err, out) {});
            console.log(chalk.red(`The ${projectName} project template already exist`));
          } else {
            console.log(chalk.green(`✔ The ${projectName} project template successfully create(项目模版创建成功)`));
          }
        });
      });
    })
  });
commander.parse(process.argv);

以上代码解析:

1). checkDire检查创建项目文件夹是否存在

const fs = require('fs');
const chalk = require('chalk');
const path = require('path');

module.exports = function (dir,name) {
  let isExists = fs.existsSync(dir);
  if (isExists) {
    console.log(chalk.red(
      `The ${name} project already exists in  directory. Please try to use another projectName`
    ));
    process.exit(1); //存在则跳出
  }
};

2). commander init 命令行进入交互问答 

3). 交互问答用inquirer命令交互工具

  • question 数组为交互命令配置,数组中每一个对象都对应一个执行命令时候的一个问题
  • type为该提问的类型,name为该问题的名字,可以在后面通过name拿到该问题的用户输入答案
  • message为问题的提示
  • default则为用户没输入时的默认为其提供一个答案
  • validate方法可以校验用户输入的内容,返回true时校验通过,若不正确可以返回对应的字符串提示文案
  • transformer为用户输入问题答案后将对应的答案展示到问题位置,需要有返回值,返回到字符串为展示内容

具体使用文档:https://github.com/SBoudrias/Inquirer.js

4). 问答结束的回调prompt方法中then里的参数是一个对象,从配置里面拉取git仓库代码。后面你们使用的时候,拉不下来,看不是不是没有仓库代码权限。

module.exports  = {
  npmUrl: 'https://registry.npmjs.org/xxx-cli',
  promptTypeList:[{
      type: 'list',
      message: '请选择拉取的模版类型:',
      name: 'type',
      choices: [{
        name: 'portal前端框架',
        value: {
          url: 'http://192.168.3.51/xxx/portal-frame.git', //框架git仓库
          gitName: 'portal-frame',
          val:'portal前端框架'
   
        }
      }]
  }],
};

5).git clone下载前端框架。也可以用download-git-repo git仓库代码下载

以上,就是全部前端脚手架内容,总共四个文件,index.js是最重要的(引用另外两个配置文件),加上一个package.json。

执行以下命令发布:

npm link // 本地调试
npm publish // 发布

三、如何使用?

在需要用到框架的时候,新建空文件夹,执行:

npm install portal-cli -g  //全局安装portal-cli
portal-cli init   //portal-cli init test ,test就是你放文件夹的名称,可以自己定义

这样前端脚手架生成模版命令工具就完成了。如果想更个性化,可以把npm包完善一下,包括包的版本说明,readme;丰富脚手架交互问询内容,美化操作提示等。

aaa9088cb7fa046014e67435b8efcb50.png

4fdef068c28e786893f6e89249826fe6.png

结语

node.js,本质还是js,js熟悉以后,结合node依赖和语法,各种试错,调试,需要耐心和细心。

另外,开始做一个实例的时候,构思思路,注意流转顺序。主要以官方文档为主,网上博客文章为辅。

官方的还是靠谱一点,博客各种坑,不是过时了,就是讲的不连贯,没有可执行性。

总的来说,学习也是一个探索的过程,共同进步!

以上【完】

参考:

https://www.cnblogs.com/cangqinglang/p/11225166.html

https://segmentfault.com/a/1190000021390776

Inquirer.js:https://github.com/SBoudrias/Inquirer.js

npm包生命周期:https://segmentfault.com/a/1190000017461666

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新《科学》重磅!科学家喊你赶快关心自己的孩子:缺乏母爱会导致大脑基因改变...

来源:精准医学人人都有父母,而绝大多数人最终都将成为父母。在一切向“钱”看的蛮荒时代,人们往往似乎并不是那么重视对孩子的爱和关心,以为可以花钱就能够轻易解决这一问题。而解决方案也大多数千篇一律,无非是给他们…

用python画个三维地球_如何用Python制作三维散点图?

你可以用matplotlib为此,matplotlib有一个mplot3d模块,它将完全按照您的要求执行。from matplotlib import pyplot from mpl_toolkits.mplot3d import Axes3D import random fig pyplot.figure() ax Axes3D(fig) sequence_containing_x_vals list(ran…

sql的BETWEEN用于文本值

选取 name 以介于 A 和 H 之间字母开始的所有网站 SELECT * FROM Websites WHERE name BETWEEN A AND H;

概率的意义:随机世界与大数法则

来源:算法与数学之美摘要: 今日统计学家,当然已完全弄懂信赖区问的意义。对不同的参数,不同的分布,可有不同的信赖区间;即使同一参数且同一分布,也可以不同的方法,得到不同的信赖区间。有时因条件不足&…

python百钱买百鸡问题答案_PHP/Python---百钱百鸡简单实现及优化

公鸡5块钱一只,母鸡3块钱一只,小鸡一块钱3只, 用100块钱买一百只鸡,问公鸡,母鸡,小鸡各要买多少只? 今天看到这题很简单 ,但是随手写出来后发现不是最优的?? php实现 //百钱百鸡 /…

python玩转android_如何用python玩跳一跳 ?(安卓版)

微信小程序的游戏相信大家都很爱玩,用手机方便而且玩起来简单。其实,我们也可以用python来玩跳一跳,一起试试吧~ 以win10系统安卓手机为例 第一步、安装python2.7 默认安装到C盘就行 安装的时候,需要如上图所示,选择ad…

人体姿态估计的过去、现在和未来

(图片付费下载自视觉中国)作者 | 俞刚(旷视研究院Detection组负责人)来源 | 知乎前言因为在ICIP2019上面和两位老师搞了一个关于人体姿态估计以及动作行为的tutorial,所以最近整理了蛮多人体姿态估计方面的文章&#x…

python结果导入excel_荐Python读取、写入EXCEL,处理数据完成运算具体实例及代码,Pycharm中导入库的操作流程...

实例及操作明细: 在以下EXCEL表格中根据已有的数据: 数据共六列,需要处理的数据是E5-E284,以及F5-F284,现在要根据以下三个公式: 升跌当前收盘价-昨日收盘价; 涨跌幅(当前收盘价-昨日收盘价&…

无言的鞭策:日本20年19人获自然科学诺奖

来源:知识分子新世纪以来日本自然科学类诺奖得主清单(注:南部阳一郎和中村修二为日裔美籍)未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包…

python turtle颜色rgb_turtle绘图总结

turtle绘图总结 (2020-05-15 11:09:13) 标签: python turtle 绘图 总结 分类: 科技 1、画布: (1) turtle.screensize(宽,高,背景颜色) (2) turtle.setup(width0.?,height0.?,startx?,starty?) 宽、高小数表示占据电脑屏幕的比例;x、y表示…

2019年工信部重点实验室名单公布 涵盖卫星导航及人工智能等多个领域

来源:卫星界据工业和信息化部官网10月9日消息,依据《工业和信息化部重点实验室管理暂行办法》(工信部科〔2014〕515号),经评审和公示,工业和信息化部公布2019年工业和信息化部重点实验室名单。根据文件&…

日志 note_深入源码解析日志框架Log4j2(二)

异步AsyncAppender​log4j2突出于其他日志的优势,异步日志实现。我们先从日志打印看进去。找到Logger,随便找一个log日志的方法。public void debug(final Marker marker, final Message msg) {logIfEnabled(FQCN, Level.DEBUG, marker, msg, msg ! null…

垂死挣扎-1

进程控制块是描述进程状态和特性的数据结构,一个进程只能有惟一的进程控制块。 编译:进行语法检查、函数分配空间,将各个函数编译成二进制码,按照特定目标文件格式生成目标文件。连接:把程序中各个文件编译生成的目标文…

最近5年,诺贝尔化学奖都颁给了谁?

来源:科研圈诺贝尔化学奖(瑞典语:Nobelpriset i kemi)由诺贝尔基金会管理,每年颁发一次,用于表彰在化学各个领域作出杰出贡献的人。第一枚诺贝尔化学奖章于 1901 年授予荷兰物理化学家雅各布斯亨里克斯范托…

6-4 二叉树的非递归遍历 (25分)_本周小结!(二叉树)

给「代码随想录」一个星标吧!❝以后每周加上一个本周小结怎么样?❞本周小结发现大家周末的时候貌似都不在学习状态,周末的文章浏览量和打卡情况照工作日差很多呀,可能是本周日是工作日了,周六得好好放松放松&#xff0…

5G核心网关键技术总览

来源:电子万花筒未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&…

samba安装_Centos安装Samba

1.先安装相关依赖以及库:yum install -y gcc-cyum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel2.下载nginx安装包:wget -c https://nginx.org/download/nginx-1.12.0.tar.gz然后直接解压tar -zxvf n…

c++函数为什么带imp_二次函数含参最值问题,老师怎么讲学生都不明白,试试这九张动图...

“一入函数深似海,从此数学是路人”很多同学都有这样的感觉。问:数学是从什么开始听不懂了?答:学函数的时候。函数问题作为中学阶段数学重要的知识点,真的是难倒了很多同学。数学老师也非常的痛苦,每次讲完函数问题&am…

解析 | 自动驾驶视觉定位与导航技术的研究与应用

来源:驭势未来视觉定位与导航技术是智能体具备的基础能力之一,随着无人驾驶的发展,基于低成本摄像头及人工智能算法的视觉定位与导航技术成为了无人驾驶的主流技术路线之一。在传统工作方式中,视觉定位与导航技术通常采用SLAM&…

visual studio 调试 定义debug常量_有趣的阅读 12个提高生产力的Visual Studio调试技巧...

以前因为工作的关系,接触过不少程序员同行,发现很多同学对所谓的小技巧tips感兴趣。本文就是一篇很有趣的文章,总结介绍了12个关于“宇宙第一IDE”—— Visual Studio的实用技巧。善加利用这些小技巧,能够在使用Visual Studio进行…