@xiao-edu/cr
The command line tool for create files by tpl
Last updated a day ago by xiao-edu .
MIT · Repository · Bugs · Original npm · Tarball · package.json
$ cnpm install @xiao-edu/cr -g
SYNC missed versions from official npm registry.

简体中文 | English

NPM version GitHub GitHub language count

standard-readme compliant semantic-release commitizen friendly code style: prettier

全局的命令行工具 CR

原仓库 @opq741/global-cli已不再更新,请直接使用@xiao-edu/cr

npm i -g @xiao-edu/cr

1. cr

用于规范化生成任意文件的命令行工具

cr 是一个兼容多平台的文件操作的命令行工具,它可以基于 cr.template.js 来生成任意文件。

可以保证多人开发 vue 或 react 应用时,大家产生的 views、components 下的页面或组件,符合一致的组件规范。

同时解放了双手,避免一个个的去创建文件并编辑一些重复性的代码。

cr 可以保证任意文件的规范,包括 markdown, scss, txt, tsx, vue 等文本类文件,它也同样适用于创建 rar, zip, jpeg, png 等二进制文件。

它也可以用来下载并更新文件,上传文件,批量生成文件夹、甚至是创建整个项目或者小型爬虫。

特性

  • 基于 cr.template.js,可以任意的自定义文件模板,来生成任意数量的符合代码规范的文件

  • 跨平台兼容 Linux 的 shell 的文件操作的命令:如 ls、touch、mkdir、rm、cp、mv、which 等 前面加上 cr 即可使用,如 cr ls -a ./bin

文件操作

平常也可以用 cr 来作文件操作,cr 是跨平台兼容 shell 的,你可以在 windows 下运行,如:


cr ls -a ./bin

# 类似于shell中的touch,但它可以递归创建文件夹
cr prettier.config.js .env eslint.config.json README.md src/routes/index.js

# 与touch命令保持一致
cr touch index.js

# 与mkdir命令保持一致
cr mkdir -p src/assets/imgs

# 与rm命令保持一致
cr rm -rf src/temp

# 与cp命令保持一致
cr cp src/temp src/test

# 与which命令保持一致
cr which npm

# 可以执行当前环境支持的命令
cr exec git status

环境要求

  • nodejs(7.6+)
  • npm

安装

npm install -g @xiao-edu/cr

如果 npm 官方源下载过慢,你可以尝试淘宝源安装:

npm install -g @xiao-edu/cr --registry https://registry.npm.taobao.org

如果你确实不想将 cr 命令暴露到全局,只想在项目的路径下使用 cr 命令,你可以只在项目中安装:

npm install -D @xiao-edu/cr

注意:这样就只能在项目文件夹下使用 cr 命令

使用

除了像上面将命令安装到全局使用外,个人更加推荐的方式是通过 npx 来运行 cr 。npx 会自动查找本机是否有安装相应模块,如果没有的话,自动去远端查找并执行。通过 npx 就不用安装到本地,每次运行都可以使用远端最新的版本。

npx cr path/to/folderName

升级

每次执行 cr 命令时,都会自动检查更新,你只要根据提示运行即可:

npm install -g @xiao-edu/cr

教程

在命令行下:

cr

即可输出帮助信息

在当前目录下,自动创建 cr.template.js

cr init ./

打开模板文件进行编辑:

vim cr.template.js

然后来生成文件吧!

cr ./report/student-count

代码生成

如你在 src 目录下运行:

cr init ./views

即会在 src/views 中生成一个默认的 cr.template.js, 你可以对其进行编辑

cr.template.js 示例:

// 之后的option会与该默认选项合并
const defaultOption = {
  // 是否忽略生成该文件
  ignore: false,
  // 如果文件存在,是否强制覆盖
  isForceOverwrite: false
}

// 导出生成文件的描述数组
const fileList = [
  {
    // 文件的路径
    path: `prettier.config.js`,
    // 写入文件中的内容,可以是模板字符串,也可以是函数,返回值会被写入该文件
    content: `
      // build at ${new Date().toDateString()}
      `
  },
  {
    // 如果没有后缀名,则认为是文件夹
    path: `src`,
    // 可以无限递归生成子目录和子文件
    children: [
      {
        path: 'index.js',
        // 文件内容可以由函数返回,返回的任何内容都会被toString()
        // 可以在函数中作任何同步的操作,包括获取数据,筛选数据,甚至上传文件
        content() {
          // 你可以发起网络请求,
          // 这里的axios是当前文件所在的项目中所能require到的npm包
          const axios = require('axios')
          const data = axios.get('http://example.com/example.json')
          const obj = {
            name: 'Alice',
            data
          }
          return obj
        }
      }
    ]
  }
]

module.exports = {
  fileList,
  defaultOption
}

然后当你运行

cr ./views/report/student-count

时,cr 会从你指定的./views/report/student-count 目录递归向外寻找 cr.template.js,根据其中导出的 fileList 来自动生成对应的文件。

cr.template.js 创建完后,是可以任意共享的,你可以选取别人写好的模板,也可以将模板分享给团队,这里也分享一个项目中可用的 vue 组件模板:

// cr.template.js
// 转成大驼峰
function toUpper(str) {
  const camelizeRE = /-(\w)/g
  // 把每个横杆分割的转成大写
  var temp = str.replace(camelizeRE, ($0, $1) => {
    return $1 ? $1.toUpperCase() : ''
  })
  // 再把首字母转成大写
  return temp[0].toUpperCase().concat(temp.slice(1))
}

// 转成横划线
function toCenterLine(str) {
  const hyphenateRE = /\B([A-Z])/g
  return str.replace(hyphenateRE, '-$1').toLowerCase()
}

// 可以利用axios请求网络上的数据
const axios = require('axios')

// 之后的option会与该默认选项合并
const defaultOption = {
  // 是否忽略生成该文件
  ignore: false,
  // 如果文件存在,是否强制覆盖
  isForceOverwrite: false
}

const fileList = [
  path: `index.vue`,
  content: componentName => {
    const centerName = toCenterLine(componentName)
    const upperName = toUpper(componentName)

    return `
// Generated by @xiao-edu/cr\n\n
<template>
  <!-- ${centerName}的容器 -->
  <div class="${centerName}-wrap">
    {{ $route.meta.title }}
  </div>
</template>
<script>
export default {
  name: '${upperName}',
  data() {
    return {

    }
  },
  methods: {

  }
}

</script>
<style rel="stylesheet/scss" lang="scss" scoped>


</style>
    `
  }

]

即可在指定文件夹下生成 index.vue,内容为你返回的 content

这里也分享一个可用的创建 react 页面组件的 cr.template.js: (基于 typescript 和 css module)

// template.js you can generate
// 转成大驼峰
function toUpper(str) {
  const camelizeRE = /-(\w)/g
  // 把每个横杆分割的转成大写
  var temp = str.replace(camelizeRE, ($0, $1) => {
    return $1 ? $1.toUpperCase() : ''
  })
  // 再把首字母转成大写
  return temp[0].toUpperCase().concat(temp.slice(1))
}

// 可以利用axios请求网络上的数据
const axios = require('axios')

// 之后的option会与该默认选项合并
const defaultOption = {
  // 是否忽略生成该文件
  ignore: false,
  // 如果文件存在,是否强制覆盖
  isForceOverwrite: false
}

// 导出生成文件的描述数组
const fileList = [
  {
    // 生成导出组件的js文件
    label: 'jsxTemplate',
    // 生成文件的路径
    filePath: './index.tsx',
    // isForceOverwrite: true,
    // content为函数,返回文件的内容
    content: componentName => {
      const name = toUpper(componentName)

      const interfaceName = `I${name}Props`
      const content = `
// Generated by @xiao-edu/cr\n\n
import React, { useState, useEffect } from 'react'

import styles from './index.module.scss'

import classnames from 'classnames'

// import { Button } from 'antd-mobile'

interface ${interfaceName} {

}

const ${name}: React.FC<${interfaceName}> = (props) => {
  // 声明一个叫 'count' 的 state 变量。
  // const [count, setCount] = useState(0)

  useEffect(() => {


    return () => {

    }
  })

  const pageClass = classnames({
    [styles.wrap]: true,
    'with-padding': true,
    'with-bg': false,
    'with-scroll': false,
  })

  return (
    <React.StrictMode>
      <div className={pageClass}>
        {'${name}页面'}
      </div>
    </React.StrictMode>
  )
}

export default ${name}
        `
      return content.trim()
    }
  },
  {
    // 生成组件对应的scss文件
    label: 'scssTemplate',
    // 如果临时不想生成这个文件,可以设置ignore为true
    // ignore: true,
    filePath: './index.module.scss',
    content: componentName => {
      const content = `
@import '@/styles/vars.scss';

.wrap{
  width: 100%;
  height: 100%;
  box-sizing: border-box;
}
        `
      return content
    }
  }
]

module.exports = {
  fileList,
  defaultOption
}

将其放置在 src/views 下,假设你想生成的页面文件夹名为:student-count,每次运行:

cr src/views/student-count

cr 会找到最近的祖先的 cr.template.js,根据其中导出的 fileList 来生成文件夹 student-count 及其内部的所有文件。

即可根据模板自动生成对应的页面组件,且页面会遵循一致的组件结构。

使用情况

  • 个人指标(移动端)
  • 大数据平台(PC 端)

目标

  • 能够简单的生成组件或其他文件,如cr ./simple-report
  • 跨平台的兼容 linux 的文件操作命令,如cr ls,cr rm,cr cp...
  • 一些有用的工具库,如cr open index.js, cr task, cr kill 3000, cr info...

开发原因

  • 在开发的过程中,总是要重复的新建文件夹和文件,填充一些相对固定的文件内容,cr 可以帮助我们去新建这些文件并填充内容。

  • 想跨平台兼容一些常用的 linux 命令。

  • 其它的一些开发需求,如创建并打开一个文件,杀掉一个进程或者端口,获取系统信息等。

如何参与

如果你有任何的建议或者意见,或者你想参与进来,你可以:

作者

协议

MIT

Current Tags

  • 1.8.25                                ...           latest (a day ago)

96 Versions

  • 1.8.25                                ...           a day ago
  • 1.8.24                                ...           15 days ago
  • 1.8.23                                ...           2 months ago
  • 1.8.22                                ...           5 months ago
  • 1.8.21                                ...           5 months ago
  • 1.8.20                                ...           5 months ago
  • 1.8.19                                ...           6 months ago
  • 1.8.18                                ...           6 months ago
  • 1.8.17                                ...           6 months ago
  • 1.8.16                                ...           7 months ago
  • 1.8.15                                ...           7 months ago
  • 1.8.14                                ...           7 months ago
  • 1.8.13                                ...           7 months ago
  • 1.8.12                                ...           7 months ago
  • 1.8.10                                ...           7 months ago
  • 1.8.9                                ...           7 months ago
  • 1.8.8                                ...           7 months ago
  • 1.8.7                                ...           7 months ago
  • 1.8.6                                ...           7 months ago
  • 1.8.5                                ...           7 months ago
  • 1.8.4                                ...           7 months ago
  • 1.8.3                                ...           7 months ago
  • 1.8.2                                ...           7 months ago
  • 1.8.1                                ...           7 months ago
  • 1.8.0                                ...           8 months ago
  • 1.7.24                                ...           8 months ago
  • 1.7.23                                ...           8 months ago
  • 1.7.22                                ...           8 months ago
  • 1.7.20                                ...           8 months ago
  • 1.7.19                                ...           8 months ago
  • 1.7.18                                ...           8 months ago
  • 1.7.17                                ...           8 months ago
  • 1.7.16                                ...           8 months ago
  • 1.7.15                                ...           8 months ago
  • 1.7.14                                ...           8 months ago
  • 1.7.13                                ...           8 months ago
  • 1.7.12                                ...           8 months ago
  • 1.7.11                                ...           8 months ago
  • 1.7.10                                ...           8 months ago
  • 1.7.9                                ...           8 months ago
  • 1.7.8                                ...           8 months ago
  • 1.7.7                                ...           8 months ago
  • 1.7.6                                ...           8 months ago
  • 1.7.5                                ...           8 months ago
  • 1.7.4                                ...           8 months ago
  • 1.7.3                                ...           8 months ago
  • 1.7.2                                ...           8 months ago
  • 1.7.1                                ...           8 months ago
  • 1.7.0                                ...           8 months ago
  • 1.5.22                                ...           8 months ago
  • 1.5.21                                ...           8 months ago
  • 1.5.20                                ...           8 months ago
  • 1.5.19                                ...           8 months ago
  • 1.5.18                                ...           8 months ago
  • 1.5.16                                ...           8 months ago
  • 1.5.15                                ...           8 months ago
  • 1.5.14                                ...           8 months ago
  • 1.5.13                                ...           8 months ago
  • 1.5.12                                ...           8 months ago
  • 1.5.10                                ...           8 months ago
  • 1.5.9                                ...           8 months ago
  • 1.5.8                                ...           9 months ago
  • 1.5.7                                ...           9 months ago
  • 1.5.6                                ...           9 months ago
  • 1.5.5                                ...           9 months ago
  • 1.5.4                                ...           9 months ago
  • 1.5.3                                ...           9 months ago
  • 1.5.2                                ...           9 months ago
  • 1.5.1                                ...           9 months ago
  • 1.5.0                                ...           9 months ago
  • 1.4.12                                ...           9 months ago
  • 1.4.11                                ...           9 months ago
  • 1.4.7                                ...           9 months ago
  • 1.4.6                                ...           9 months ago
  • 1.4.5                                ...           9 months ago
  • 1.4.4                                ...           9 months ago
  • 1.4.3                                ...           9 months ago
  • 1.4.2                                ...           9 months ago
  • 1.4.1                                ...           9 months ago
  • 1.4.0                                ...           9 months ago
  • 1.3.5                                ...           9 months ago
  • 1.3.4                                ...           9 months ago
  • 1.3.3                                ...           9 months ago
  • 1.3.2                                ...           9 months ago
  • 1.3.1                                ...           9 months ago
  • 1.3.0                                ...           9 months ago
  • 1.2.34                                ...           9 months ago
  • 1.2.33                                ...           9 months ago
  • 1.2.30                                ...           9 months ago
  • 1.2.29                                ...           9 months ago
  • 1.2.28                                ...           9 months ago
  • 1.2.27                                ...           9 months ago
  • 1.2.26                                ...           9 months ago
  • 1.2.25                                ...           9 months ago
  • 1.2.24                                ...           9 months ago
  • 1.2.23                                ...           9 months ago
Maintainers (1)
Downloads
Today 1
This Week 16
This Month 16
Last Day 15
Last Week 5
Last Month 23
Dependencies (40)
Dependents (0)
None

Copyright 2014 - 2016 © taobao.org |