V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
imba97
V2EX  ›  分享创造

initx 一个 Node.js 脚本引擎

  •  
  •   imba97 ·
    imba97 · 2 天前 · 773 次点击

    initx 一个脚本引擎

    npx initx <something>
    

    它只做以下几件事

    • 提供方便的入口
    • 收集插件
    • 收集匹配器命中的执行器
    • 处理可能的用户交互
    • 执行!🚀

    所有具体的操作,会通过插件的形式进行

    我目前写了一些基本的,我个人用得到的插件,我想尽可能减少我使用一些工具(例如 git 、gpg )的复杂度

    每个插件是一个 npm 库,首先可以先安装插件管理工具,这也是一个插件

    npm i -g @initx-plugin/manager
    

    可以通过这个更方便的查看、添加、移除、更新插件

    插件示例

    # 安装插件
    npx initx plugin add git
    
    # initx
    npx initx user imba97 [email protected]
    
    # 等于
    git config --global user.name imba97
    git config --global user.email [email protected]
    

    设置 Git GPG 签名

    # initx
    npx initx gpg true
    # 设置 GPG Key ,自动查询,如果只有一个则设置该 Key ,如果有多个则让用户选择
    npx initx gpg
    
    # 等于
    git config --global commit.gpgsign true
    git config --global user.signingkey 92038B3E14C0D332542FB082B851A3E43D739400
    git config --global gpg.program D:/GnuPG/gpg.exe
    

    快速复制

    # 安装插件
    npx initx plugin add cp
    # SSH 公钥
    npx initx cp ssh
    # GPG 公钥
    npx initx cp gpg
    # 当前目录
    npx initx cp cwd
    

    插件开发

    提供插件开发起步项目 initx-plugin-starter

    插件主要是匹配器执行器,通过配置的匹配器匹配用户输入内容,执行对应的操作

    匹配器的写法支持很多种,以下是 @initx-plugin/git 插件的写法

    export default class GitPlugin extends InitxPlugin {
      matchers = {
        [GitMatcher.Init]: {
          // 以下三种任意一个匹配成功,都返回类型 GitMatcher.Init
          matching: [
            /^( https?|git):\/\/.*\.git$/,
            /^(git@.*\.git)$/,
            /^ssh:\/\/git@.*\.git$/
          ],
          description: 'Initialize a new git repository'
        },
    
        [GitMatcher.User]: {
          matching: 'user',
          description: 'Set user name and email for git configuration'
        },
    
        // 可以写相同的 matching ,这会让用户选择,最后返回用户选择的 GitMatcher 类型
        [GitMatcher.Gpg]: {
          matching: 'gpg',
          description: 'Enable or disable GPG signing for git commits'
        },
    
        [GitMatcher.GpgKey]: {
          matching: 'gpg',
          description: 'Set GPG key for git commits'
        }
      }
    
      async handle({ key }: InitxContext, type: GitMatcher, ...others: string[]) {
        switch (type) {
          case GitMatcher.Init: {
            await repositoryHandle(key, ...others)
            break
          }
          // ...
        }
      }
    }
    

    不同插件指令也可重复,会让用户选择

    Github:initx-collective/initx

    3 条回复    2024-11-19 13:14:23 +08:00
    imba97
        1
    imba97  
    OP
       2 天前
    也可以全局安装 `initx`

    ```
    npm i -g initx
    ```

    这样执行的时候可以不写 `npx`

    ```
    initx plugin list
    initx plugin add git
    # ...
    ```
    imgfans
        2
    imgfans  
       2 天前 via iPhone
    这个好!收藏咯
    imba97
        3
    imba97  
    OP
       2 天前
    @imgfans 感谢支持 👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4672 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:59 · PVG 17:59 · LAX 01:59 · JFK 04:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.