关于cli:文盘Rust起手式CLI程序-京东云技术团队

技术的学习从不会到会的过程是最有意思的,也是领会最多的。一旦纯熟了,常识变成了常识,可能就失去了记录学习过程的最佳时机。 在我看来学习一门计算机语言和学习人类语言有很多共通之处。咱们学习人类语言是从单个的词开始,而后是简略句子,通过一直的与别人交互练习把握语法和语言习惯。当纯熟到肯定水平就能够表达思想。计算的语言也差不多,相熟关键词,根本逻辑,规范库,写利用。只是沟通的对象是机器而已。 既然是学就不能在开始搞的太难。学习原本就是个艰辛的差事。上来就干特地简单的事件往往会保持不上来。天下难事必做于易,从简入繁,从易到难,方为邪道。 先聊聊最简略的CLI(Command Line Interface)程序。其实咱们每学习一门语言的 hello world 程序就是CLI,只是没那么多交互而已。 做命令行程序最繁琐的事件是解决交互。交互大体分两种。一种是咱们最相熟shell下的交互模式,每次一个命令,配合参数实现一次解决返回一组后果。这种模式解决起来比拟容易Rust也有相当优良的第三方lib (clap)。第二种是畛域交互,就像我是应用MySql或者redis的客户端程序。这种程序能够玩儿的货色就比拟多了像如何实现交互,如何来做子命令的提醒。这些货色 clap 并没有提供,须要咱们本人来实现。 interactcli-rs是我在工作过程中做的一个交互模式命令行脚手架。实现了一些罕用性能。 上面咱们来看看如何通过几个步骤疾速的实现一个性能绝对齐全的CLI程序。和做饭一样,可能疾速取得成就感的形式是找半成品间接下锅炒一盘:)。 上面咱们具体看看,如何通过interactcli-rs实现一个功能齐全的命令行程序 来点感性认识先把我的项目clone下来运行个例子 clone 我的项目 git clone https://github.com/jiashiwen/interactcli-rs.gitcd interactcli-rs命令行模式 cargo run requestsample baidu交互模式 cargo run -- -iinteract-rs> requestsample baidu运行下面的命令是通过http来申请百度 四步做个CLI首先咱们先来看看框架的目录构造 .├── examples├── log├── logs└── src ├── cmd ├── commons ├── configure ├── interact ├── logger └── requestcmd目录是咱们做本人性能时要动的次要目录,上面咱们一步一步的实现requestsample命令。 定义命令 cmd 模块用于定义命令以及相干子命令,requestsample.rs 中定义了拜访百度的命令 use clap::Command;pub fn new_requestsample_cmd() -> Command<'static> {clap::Command::new("requestsample").about("requestsample").subcommand(get_baidu_cmd())}pub fn get_baidu_cmd() -> Command<'static> {clap::Command::new("baidu").about("request www.baidu.com")}new\_requestsample\_cmd 函数定义了命令 "requestsample",get\_baidu\_cmd 函数定义了 requestsample 的子命令 baidu ...

September 7, 2023 · 2 min · jiezi

关于cli:从0构建cli脚手架

前言脚手架的作用缩小重复性的工作,不须要复制其余我的项目再删除无关代码,或者从零创立一个我的项目和文件。能够依据交互动静生成我的项目构造和配置文件。多人合作更为不便,不须要把文件传来传去。本文我的项目残缺代码请戳https://github.com/xiumubai/xiumu-cli 实现性能xiumu init <projectName>依据近程模板,初始化一个我的项目(vue、react)xiumu --version 查看以后版本号xiumu -h 帮忙命令第三方库仓库用处commander命令行工具download-git-repo用来下载近程模板inquirer交互式命令行工具ora显示loading动画我的项目初始化创立一个空我的项目(xiumu-cli),应用 npm init 进行初始化。 装置依赖yarn add commander inquirer download-git-repo 增加bin命令在package.json文件中增加 { "bin": { "xiumu": "./index.js" },}这样咱们就能够应用xiumu这个命令了。 在index.js文件头部中增加#!/usr/bin/env node用来指定运行环境。 增加command命令接下来须要增加init命令,这样就能够应用xiumu init <projectName>进行我的项目的初始化。 commander是 node.js 命令行解决方案。能够应用它进行命令交互。 index.js #!/usr/bin/env nodeconst { Command } = require('commander');const program = new Command();class Init { start() { program .version(require('./package.json').version) .option('-v, --version', '查看以后版本'); program .command('init <projectName>') .description('create a new project') .action((projectName, options) => { console.log('projectName': projectName) }); program.parse(process.argv); }}new Init().start();运行node index.js init test,在日志中失去 ...

May 8, 2023 · 2 min · jiezi

关于cli:AWS-CLI入门教程亲测

背景因为公司有用到S3,所以整顿了一个S3的简略入门教程。当然,入门之后有其余更高级的用法需要,就靠本人去查文档了。入门的教程能让你疾速上手,不至于翻阅一堆文档,容易被劝退。这里次要是介绍如何用cli去操作S3。 官网文档https://docs.aws.amazon.com/cli/latest/userguide/cli-services... 装置客户端https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/gettin... curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/install什么是 Amazon S3就是国内的对象存储,更粗犷的比喻,能够了解成一个云盘(只是一个有接口的云盘)。下边是官网术语: Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务,提供行业当先的可扩展性、数据可用性、安全性和性能。各种规模和行业的客户能够为简直任何应用案例存储和爱护任意数量的数据,例如数据湖、云原生应用程序和挪动应用程序。借助高老本效益的存储类和易于应用的治理性能,您能够优化老本、组织数据并配置精密调整过的访问控制,从而满足特定的业务、组织和合规性要求。 配置aws configureAWS Access Key ID [None]: xxxAWS Secret Access Key [None]: xxxDefault region name [None]: cn-northwest-1Default output format [None]: json列出对象#列出所有bucketaws s3 ls#列出单个bucketaws s3 ls s3://bucket-name/#列出bucket中的某个对象aws s3 ls s3://bucket-name/example/同步对象s3 sync 将更新与指标地位中同名文件的大小或批改工夫不同的任何文件。 #格局$ aws s3 sync <source> <target> [--options]上面的示例显示了如何应用 --delete 选项。 // Delete local file$ rm ./MyFile1.txt// Attempt sync without --delete option - nothing happens$ aws s3 sync . s3://my-bucket/path// Sync with deletion - object is deleted from bucket$ aws s3 sync . s3://my-bucket/path --deletedelete: s3://my-bucket/path/MyFile1.txt// Delete object from bucket$ aws s3 rm s3://my-bucket/path/MySubdirectory/MyFile3.txtdelete: s3://my-bucket/path/MySubdirectory/MyFile3.txt// Sync with deletion - local file is deleted$ aws s3 sync s3://my-bucket/path . --deletedelete: MySubdirectory\MyFile3.txt// Sync with Infrequent Access storage class$ aws s3 sync . s3://my-bucket/path --storage-class STANDARD_IA挪动对象#格局aws s3 mv <source> <target> [--options]#将所有对象从 s3://bucket-name/example 挪动到 s3://my-bucket/aws s3 mv s3://bucket-name/example s3://my-bucket/#将本地文件从当前工作目录挪动到 Amazon S3 存储桶(相当于cp+rm)aws s3 mv filename.txt s3://bucket-name#将文件从 Amazon S3 存储桶挪动到当前工作目录(相当于cp+rm)aws s3 mv s3://bucket-name/filename.txt ./复制对象#将所有对象从 s3://bucket-name/example 复制到 s3://my-bucket/aws s3 cp s3://bucket-name/example s3://my-bucket/#以下示例应用 s3 cp 命令,将本地文件从当前工作目录复制到 Amazon S3 存储桶aws s3 cp filename.txt s3://bucket-name#下载单个文件aws s3 cp s3://bucket-name/filename.txt ./删除对象aws s3 rm s3://bucket-name/example/filename.txt #删除单个文件aws s3 rm s3://bucket-name/example --recursive#删除所有对象更多更多最新文章,请关注同名公众号。 ...

May 5, 2023 · 1 min · jiezi

关于cli:现代化命令行工具之Ubuntu-2004qbit

批量配置繁难的 shell 脚本:https://github.com/qbit-git/m... bash modern_cli_ubuntu2004.sh本脚本实用于与有 root/sudo 权限应用本脚本实用于初始化,没做条件判断,不适用于简单情景工具rg 替换 grep编程语言: RustGitHub:https://github.com/BurntSushi...装置与配置 sudo apt install ripgrep -y# 上面一句是防止与下文介绍的 bat 抵触sudo sed -i '/\/usr\/.crates2.json/d' /var/lib/dpkg/info/ripgrep.listecho 'alias grep=rg' >> ~/.bashrcbat 替换 cat编程语言: RustGitHub: https://github.com/sharkdp/bat装置与配置 sudo apt install bat -yecho 'alias cat=batcat' >> ~/.bashrc fd 替换 find编程语言: RustGitHub: # https://github.com/sharkdp/fd sudo install fd-find -yecho 'alias fd=fdfind' >> ~/.bashrc echo 'alias find="fdfind -H"' >> ~/.bashrc fzf 命令行含糊匹配编程语言: GoGitHub: https://github.com/junegunn/fzf sudo apt install fzfecho 'source /usr/share/doc/fzf/examples/completion.bash' >> ~/.bashrc echo 'source /usr/share/doc/fzf/examples/key-bindings.bash' >> ~/.bashrcpipx编程语言: PythonGitHub: https://github.com/pypa/pipx装置与配置 ...

August 16, 2021 · 1 min · jiezi

关于cli:入门cli

overview本示例能够创立一个目录、二个文件。 init projectmkdir projectCommandcd projectCommandlerna initlerna create testCommandlerna add commanderdefined批改./projectCommand/packages/testCommand/package.json { ... "bin": { ... "demo": "./bin/initProject.js", }}init cli在中创立./projectCommand/packages/testCommand/bin/initProject.js。编辑内容如下: #!/usr/bin/env nodeconst program = require('commander')const fs = require('fs')console.log('begin')<!-- 定义命令 start -->program .command('create <project-name>') .description('create a new project') .option('-f, --file <file>', 'name of main file') .option('-m, --minor', 'create minor file') .action((projectName, options) => { console.log('projectName', projectName) console.log('options', options) fs.mkdir(`./${projectName}`, (error) => { if (error) { console.log('我的项目曾经存在,不能再次创立。') } else { console.log('创立目录胜利') fs.writeFile(`./${projectName}/${options.file}`, 'this is main file.', (err) => { if (err) { console.log('创立主文件失败') } else { console.log('创立主文件胜利') } }) if (options.minor) { fs.writeFile(`./${projectName}/minor.md`, 'this is minor file.', (err) => { if (err) { console.log('创立主文件失败') } else { console.log('创立主文件胜利') } }) } } })})<!-- 定义命令 end -->// 解析命令。即依据输出到终端的内容执行相应命令。program.parse(process.argv)usage在本包中应用命令在./projectCommand/packages/testCommand下执行npm link再执行initProject create li -f main.js -m,则输入: ...

May 11, 2021 · 1 min · jiezi

关于cli:入门commander

overview官网写的readme太差了,连一个像样的demo都没有。我看了几天readme也没学会。起初还是去看源码本人揣摸进去的。是tj太nb了,让我这个小白的看不懂他的的文章,还是写不分明本人的库能干什么、怎么干。上面是我写的demo。不便像我这样的小白入门。若你能看懂tj写的readme。关了这个页面吧。 init projectmkdir projectCommandcd projectCommandlerna initlerna create testCommandlerna add commanderdefined批改./projectCommand/packages/testCommand/package.json { ... "bin": { "demo": "./bin/index.js" }}init cli在中创立./projectCommand/packages/testCommand/bin/index.js。编辑内容如下: #!/usr/bin/env node// 疾速引入Commander的实例const program = require('commander')// 定义选项program .option('-d, --debug', 'output extra debugging') .option('-s, --small', 'small pizza size')// 解析选项,即:执行选项program.parse(process.argv) // process.argv 会获取命令行的数据,返回类型是数组。// 依据选项及其值,执行相应逻辑。if (program.debug) console.log(program.opts())if (program.small) console.log('- small pizza size')该文件的解决逻辑:依据选项执行相应输入。 usage在本包中应用命令在./projectCommand/packages/testCommand下执行npm link再执行demo -d,则输入:{ debug: true, small: undefined }再执行demo -s,则输入:- small pizza size若失去相应输入,则验证cli运行正确。 在其余包中应用命令创立一个其余包在./projectCommand/中执行 lerna create useCommandlerna add testCommandcd packages/testCommandnpm unlink // 勾销全局软链接该包demo -d // 验证是否勾销胜利// => zsh: command not found: demo编辑./projectCommand/packages/useCommand/package.json ...

May 10, 2021 · 1 min · jiezi

关于cli:通过-Vite-的-createapp-学习如何实现一个简易版-CLI

前言前段时间,尤雨溪答复了一个宽广网友都好奇的一个问题:Vite 会不会取代 Vue CLI? 答案是:是的! 那么,你开始学 Vite 了吗?用过 Vite 的同学应该都相熟,创立一个 Vite 的我的项目模版是通过 npm init @vitejs/app 的形式。而 npm init 命令是在 npm@6.1.0 开始反对的,实际上它是先帮你装置 Vite 的 @vitejs/create-app 包(package),而后再执行 create-app 命令。 至于 @vitejs/create-app 则是在 Vite 我的项目的 packages/create-app 文件夹下。其整体的目录构造: // packages/create-app|———— template-lit-element|———— template-lit-element-ts|———— template-preact|———— template-preact-ts|———— template-react|———— template-react-ts|———— template-vanilla|———— template-vue|———— template-vue-tsindex.jspackage.jsonVite 的 create-app CLI(以下统称为 create-app CLI)具备的能力不多,目前只反对根底模版的创立,所以全副代码加起来只有 160 行,其整体的架构图: 能够看出的确非常简单,也因而 create-app CLI 是一个很值得入门学习如何实现简易版 CLI 的例子。 那么,接下来本文将会围绕以下两个局部带着大家一起通过 create-app CLI 来学习如何制作一个简易版的 CLI: create-app 中应用到的库(minimist、kolorist)逐渐拆解、剖析 create-app CLI 源码create-app CLI 中应用到的库create-app CLI 实现用到的库(npm)的确很有意思,既有咱们相熟的 enquirer(用于命令行的提醒),也有不相熟的 minimist 和 kolorist。 那么,前面这两者又是拿来干嘛的?上面,咱们就来理解一番~ ...

February 8, 2021 · 4 min · jiezi

关于cli:交互型命令行

在前人的根底上,自定义交互脚本是一个很简略的事件。 这里介绍四个工具,别离作用在不同的畛域: shelljs 执行脚本程序inquirer 命令行用户交互界面chalk 命令行日志款式可嵌套、可链式commander 自定义命令行参数// const spawn = require('child_process').spawn// const { Command } = require('commander')const shell = require('shelljs');const inquirer = require('inquirer');const chalk = require('chalk');const scriptsConfig = require('../config/scripts')const runModes = require('../config/modes')// const program = new Command();let curScriptEvent = process.env.npm_lifecycle_event; // E.g.:'npm run serve'中的'serve'let curScriptSource = process.env.npm_lifecycle_script; // E.g.:'npm run serve: vue-cli-service serve'的'vue-cli-service serve'const build = async () => { let res; try { // j、k或者数字键抉择 res = await inquirer.prompt([ { type: 'list', name: 'operation', message: '请抉择你要运行的命令:npm run', choices: ['serve', 'build', 'push', 'fds', 'test'] }, { type: 'list', name: 'mode', message: '请抉择你要执行的环境?', choices: ['dev', 'prev', 'pro'] }, ]); } catch(e) { if (e.isTryError) { console.log(chalk.red("Prompt couldn't be rendered in the current environment")) } else { console.log(chalk.red("Error:", e)) } } const { operation, mode } = res; console.log(chalk.green(`正在执行操作npm run ${operation}---${mode}......`)); curScriptEvent = `${operation}${mode ? (':' + mode) : ''}` curScriptSource = scriptsConfig[curScriptEvent] if (process.platform === 'win32') { shell.exec(`npx cross-env ${curScriptSource}`) // spawn('npx cross-env', [curScriptSource], { // stdio: 'inherit', // shell: true // }) } else { shell.exec(`npm run ${curScriptEvent}`) // spawn('npm', ['run', curScriptEvent]) }}build();优化版: ...

January 24, 2021 · 2 min · jiezi