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

CodeLauncher · 我们做了一个 macOS 上的后端开发服务器进程管理工具

  •  4
     
  •   Livid · 2022-01-03 19:00:44 +08:00 · 13366 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大部分的现代 Web 开发框架,都需要启动一个进程,然后当你改了什么东西的时候,它就自动 build 或者重启。

    所以我们为了自己每天的需求,做了一个管理工具 CodeLauncher ,用来启动那些本地开发时需要的各种进程,及查看其输出:

    进程启动之后,右键菜单上会提供一些常用的功能:

    • 在浏览器里打开端口(如果参数中有 --port 之类的关键字的话)
    • 在工作目录打开 Terminal
    • 如果安装了的话,用 VS Code 打开项目目录
    • 在 Finder 中打开项目目录
    • 把运行中的 PID 复制到剪贴板

    在添加项目的时候,可以指定执行文件的绝对路径。如果没有指定绝对路径,那么会从当前的 PATH 中去猜。及指定工作目录和环境变量。

    最新版本的下载和源代码欢迎访问项目网站 cl.v2ex.pro

    第 1 条附言  ·  2022-01-08 01:11:42 +08:00

    Update 1.0.1 released on Jan 7, 2022

    • 修复了一个解析 arguments 时的问题 (Issue #2 https://github.com/v2ex/launcher/issues/2)
    • 修复了一个处理 stderr 输出时的问题
    • 使用了新的颜色标识:绿色是运行中的任务,灰色是默认或者 clean exit 状态,红色是上次退出时 exit code 非 0 的状态
    48 条回复    2024-03-22 20:21:04 +08:00
    airyland
        1
    airyland  
       2022-01-03 19:50:42 +08:00   ❤️ 1
    赞。如果可以从 menubar 快捷查看和操作可能会更方便。
    Livid
        2
    Livid  
    MOD
    OP
       2022-01-03 19:53:13 +08:00   ❤️ 1
    @airyland 嗯,收到。目前是 1.0 版本刚刚上线,把基本流程跑起来。接下来确实还有很多可以改进的。
    Kai
        3
    Kai  
    MOD
       2022-01-03 19:53:30 +08:00 via iPhone
    @airyland 感谢建议,也可以直接添加 Issues :D
    leaves615
        4
    leaves615  
       2022-01-03 19:59:44 +08:00   ❤️ 1
    非常棒。做的很漂亮,我也写了一个差不多的。不过没有你写的漂亮。
    xstmjh123
        5
    xstmjh123  
       2022-01-03 20:37:16 +08:00
    感觉像 PM2 的 UI 版?
    devliu1
        6
    devliu1  
       2022-01-03 21:26:27 +08:00
    天呐 我之前也做了个,只是没有 UX 。

    @xstmjh123
    @leaves615
    fyibmsd
        7
    fyibmsd  
       2022-01-03 21:42:23 +08:00   ❤️ 2
    可以支持下导入 brew services 吗
    chenkali
        8
    chenkali  
       2022-01-03 23:23:23 +08:00   ❤️ 2
    能否 调整最低支持版本 macos 10.X ? 好像必须是 macos 11 ?
    mcfog
        9
    mcfog  
       2022-01-04 08:53:57 +08:00 via Android   ❤️ 1
    之前一直用的 https://github.com/cortesi/modd 建议参考核心需求:
    pattern match 修改什么文件重启
    多个进程一组管理(常见:前端+后端+反代)
    配置导出文本格式 /导入

    之前命令行的痛点主要是输出日志混在一起,然后就是只能整组启停不能临时 disable 导致经常不必要地重启 webpack
    Livid
        10
    Livid  
    MOD
    OP
       2022-01-04 09:56:30 +08:00
    @mcfog

    CodeLauncher 支持把一个项目里的多个不同的进程配置在一个 Project 里。然后点击上面的进程或者下面的下拉列表就可以切换看输出,比如这是在一个 Python Flask 项目里,主进程和一个按需运行的 pytest 进程:

    Livid
        11
    Livid  
    MOD
    OP
       2022-01-04 09:58:44 +08:00
    @fyibmsd 嗯,确实。

    目前 brew services 启动之后看输出不方便。
    Livid
        12
    Livid  
    MOD
    OP
       2022-01-04 10:00:03 +08:00
    @chenkali 这个我们试试。因为是用 SwiftUI 写的,所以如果用户端的 macOS 版本比较新的话,就可以支持很多 SwiftUI 的新功能。
    Livid
        13
    Livid  
    MOD
    OP
       2022-01-04 10:07:23 +08:00
    @mcfog 观察一个目录里的文件更改,然后 process manager 来重启进程这个目前 CodeLauncher 还没有实现。我们目前主要是在用 CodeLauncher 来启动已经具有这类行为的框架,比如 Flask ,Zola 等等。

    自身支持文件观察然后重启进程这个接下来我们研究一下。

    你目前在开发什么的时候会需要用到这样的场景?
    mcfog
        14
    mcfog  
       2022-01-04 11:27:55 +08:00 via Android   ❤️ 1
    @Livid golang 项目,PHP 的 swoole/workerman 之类非 fpm 的项目,包括 node 项目为了统一方案我都会用 modd 来管
    hccsoul
        15
    hccsoul  
       2022-01-04 11:36:11 +08:00   ❤️ 2
    Hope to add Chinese support
    orqzsf1
        16
    orqzsf1  
       2022-01-04 11:46:10 +08:00
    mark ,我也想做一个类似的。。今天就看到了
    Livid
        17
    Livid  
    MOD
    OP
       2022-01-04 12:37:57 +08:00
    @mcfog 所以,比如 golang 项目就是,目录里如果符合某个 pattern 的文件发生变更了,就跑一个 build 指令。然后这个 build 指令是那种跑完就退出,不会一直运行的?
    Buges
        18
    Buges  
       2022-01-04 13:00:46 +08:00 via Android   ❤️ 1
    @Livid #17 这种需求可以直接内置一个 watchexec ,不需要自己再实现一遍了。另外对 golang 而言是有专门的 hot reload 工具的 https://github.com/cosmtrek/air
    AilF
        19
    AilF  
       2022-01-04 13:29:41 +08:00
    点赞,试用看看
    abigeater
        20
    abigeater  
       2022-01-04 13:42:39 +08:00
    回家试用下。
    经常在终端里起了程序后忘记结束进程再关闭终端,然后只能手动通过 PID kill 掉。
    mcfog
        21
    mcfog  
       2022-01-04 17:37:20 +08:00   ❤️ 1
    @Livid
    以 modd 的能力来说两种都支持,你说的在 modd 里叫 prep 一般放 linter 、build 、test 之类的,失败有输出警告,有变更时会重新执行;
    而另一种是持续不退出,有变更时重启就是 daemon 了,总之大概的意思是类似这样

    {
    daemon: caddy run // 反向代理
    }

    Caddyfile {
    prep: caddy reload // 变更时 reload
    }

    backend/**/*.go {
    indir: ./backend
    prep: go test // 后端 test
    daemon: go run // 后端 server
    }

    frontend/**/*.js {
    indir: ./frontend
    prep: npm run lint // 前端 linter
    daemon: npm start // 前端 server
    }

    一般而言分发一长串 brew install (包括 modd 和各种 sdk )和这个文本文件,就能够在一个全新的系统上直接启动项目了

    刚才试了一下,导出的 json 里的路径是绝对路径的会影响团队成员之间共享,发明一个.cl.json 之类的后缀,路径默认以这个后缀文件作为起点如何?甚至可以去注册打开方式直接双击导入。 另外 log 没有搜索或导出
    Livid
        22
    Livid  
    MOD
    OP
       2022-01-04 17:41:26 +08:00
    @mcfog 嗯,是的。更好用导入导出的 JSON 格式这个我们正在做。cc @Kai
    guyskk0x0
        23
    guyskk0x0  
       2022-01-04 21:53:23 +08:00   ❤️ 1
    有这个需求👍,试用了一下,提一点点建议~

    - 创建 Task 的加号按钮不明显,不好找。
    - 任务 executable 和 arguments 可以合并,也就是合并成 shell 命令。
    - 启动和停止按钮可以合并成一个,类似音乐播放按钮。
    - 未运行的状态用灰色更好,运行失败可以用红色。
    - 创建新 Task 可以复用同项目 Task 的 Workdir 设置。
    - 日志输出,解析 URL 并支持点击,类似 iTerm2 。
    - 网站 favicon 没有设置。
    - 可以考虑显示任务内存和 CPU 占用情况。
    quxuanxuan
        24
    quxuanxuan  
       2022-01-05 16:50:25 +08:00   ❤️ 1
    日志如果支持彩色就更好了
    Livid
        25
    Livid  
    MOD
    OP
       2022-01-08 01:13:05 +08:00   ❤️ 1
    @guyskk0x0 在 2022 年 1 月 7 日的 1.0.1 更新中按照你的反馈使用了新的颜色系统:

    * 绿色是运行中的状态
    * 灰色是默认或者 clean exit
    * 红色是上次退出时 exit code 非 0
    akira
        26
    akira  
       2022-01-08 17:27:40 +08:00
    看起来不错呢,windows 下类似的东西么
    neochen13
        27
    neochen13  
       2022-01-09 21:31:58 +08:00 via Android
    发现新世界,试试看
    oldhuhu
        28
    oldhuhu  
       2022-01-10 18:31:11 +08:00 via Android   ❤️ 1
    建议支持一下服务直接的依赖关系,只靠 delay 来确定启动顺序有点不可靠
    xieyuheng
        29
    xieyuheng  
       2022-01-11 20:50:32 +08:00   ❤️ 1
    站长加油哇!
    imxieke
        30
    imxieke  
       2022-01-18 12:26:30 +08:00
    可惜了 11.2.3 用不了
    tangbao
        31
    tangbao  
       2022-01-24 23:10:17 +08:00   ❤️ 1
    @Livid

    这个真的很好用,节约了很多时间,感谢!

    还请问能不能默认加入 ssh 的支持来执行远程设备上的脚本呢,就像 iOS 上的快捷指令一样。
    D0n9
        32
    D0n9  
       2022-01-27 18:28:15 +08:00
    一直用 supervisor 来管理,这个和 supervisor 比 优势是啥
    fenglangjuxu
        33
    fenglangjuxu  
       2022-01-28 14:23:43 +08:00   ❤️ 1
    @D0n9 #32

    ```
    If you have used supervisor on Linux before, you will find the concept is quite similar. CodeLauncher works like a GUI version of supervisor for macOS, while the main goals are to make it easier to organize processes and check the output.
    ```
    maxthon
        34
    maxthon  
       2022-01-28 15:45:49 +08:00   ❤️ 1
    开始用用看看~
    提一个看到的小问题:log 不能跨行复制
    liuzhaowei55
        35
    liuzhaowei55  
       2022-02-18 09:32:25 +08:00 via iPhone
    @Livid ngrok http 80 命令不能捕捉到运行状态,也无法正常启动
    Livid
        36
    Livid  
    MOD
    OP
       2022-02-18 09:49:41 +08:00
    @liuzhaowei55 可能是 PATH 问题。

    试试输入完整路径可以启动么?
    Livid
        37
    Livid  
    MOD
    OP
       2022-02-18 09:50:16 +08:00
    @liuzhaowei55 或者给我看一下你设置任务的那个界面的截图?
    liuzhaowei55
        38
    liuzhaowei55  
       2022-02-18 10:48:36 +08:00 via iPhone
    @Livid ![Snipaste_2022-02-18_10-40-53.png]( https://w-img-pub.moorper.com/2022/02/18/7af93e36877e3.png)
    配置上是比较简单的
    Livid
        39
    Livid  
    MOD
    OP
       2022-02-18 10:49:54 +08:00
    @liuzhaowei55 你的 ngrok 的安装路径是?
    liuzhaowei55
        40
    liuzhaowei55  
       2022-02-18 10:51:40 +08:00 via iPhone   ❤️ 1
    @liuzhaowei55 我重新试了一下,命令正常运行,但输出还是无法捕捉到
    Livid
        41
    Livid  
    MOD
    OP
       2022-02-18 10:53:38 +08:00 via iPhone   ❤️ 1
    @liuzhaowei55 收到。我会在我的环境里试试是什么问题。
    liuzhaowei55
        42
    liuzhaowei55  
       2022-02-18 10:53:54 +08:00 via iPhone
    @Livid 应该是和 ngrok 的信息输出有关,它是新起了一个类似 screen 这样的,然后输出
    subpo
        43
    subpo  
       2022-02-24 15:07:31 +08:00

    我的配置如图,点击 run 无法启动, 我的启动命令是这样的, 可能是我没有分清楚 executable path 和 arguments 的区别?

    alias auth="cd ~/xxxxx/auth_api ; git rev-parse --abbrev-ref H
    │ EAD; HASH_ENCRYPT_SALT_DB=xxxxx
    │ HASH_ENCRYPT_SALT_TRADE=xxxxxxx
    │ /usr/bin/env ./venv/bin/python ./src/auth-api.py runserver
    │ 8004 --settings=global_base.settings.local-my"
    Livid
        44
    Livid  
    MOD
    OP
       2022-02-24 15:19:51 +08:00
    @subpo Executable Path 是你的 Python 的绝对路径。比如 /usr/bin/python 这样的。如果你安装了自己的 Python ,那么可能是更长的一个路径。

    然后 Arguments 是跟在 python 后面的所有参数。

    比如这是我本地的一个 Tornado 项目的配置,供参考:

    WildCat
        45
    WildCat  
       2022-05-24 08:49:13 +08:00
    ahu
        46
    ahu  
       280 天前
    https://cl.v2ex.pro/ 上的下载链接貌似失效了?@Livid

    opensource.v2ex.pro 意外终止了连接

    后来从 GitHub 下载的
    Livid
        47
    Livid  
    MOD
    OP
       280 天前
    @ahu 刚才试了一下,没有复现你提到的这个问题。
    ahu
        48
    ahu  
       280 天前
    @Livid #47 现在试了下,的确 ok 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2799 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:27 · PVG 10:27 · LAX 18:27 · JFK 21:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.