CodeLauncher 我们做了一个 macOS 上的后端开发服务器进程管理工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Livid
178.63D
596.27D
V2EX    分享创造

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

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

    大部分的现代 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
    PRO
       2022-01-03 19:53:13 +08:00   1
    @airyland 嗯,收到。目前是 1.0 版本刚刚上线,把基本流程跑起来。接下来确实还有很多可以改进的。
    Kai
        3
    Kai  
       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
    PRO
       2022-01-04 09:56:30 +08:00
    @mcfog

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

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

    目前 brew services 启动之后看输出不方便。
    Livid
        12
    Livid  
    MOD
    OP
    PRO
       2022-01-04 10:00:03 +08:00
    @chenkali 这个我们试试。因为是用 SwiftUI 写的,所以如果用户端的 macOS 版本比较新的话,就可以支持很多 SwiftUI 的新功能。
    Livid
        13
    Livid  
    MOD
    OP
    PRO
       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
    PRO
       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
    PRO
       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
    PRO
       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 下类似的东西么
    BearCookie
        27
    BearCookie  
       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 比 优势是啥
    keepfun
        33
    keepfun  
       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
    PRO
       2022-02-18 09:49:41 +08:00
    @liuzhaowei55 可能是 PATH 问题。

    试试输入完整路径可以启动么?
    Livid
        37
    Livid  
    MOD
    OP
    PRO
       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
    PRO
       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
    PRO
       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  
    PRO
       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
    PRO
       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  
       2024-03-22 11:00:00 +08:00
    https://cl.v2ex.pro/ 上的下载链接貌似失效了?@Livid

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

    后来从 GitHub 下载的
    Livid
        47
    Livid  
    MOD
    OP
    PRO
       2024-03-22 11:19:26 +08:00
    @ahu 刚才试了一下,没有复现你提到的这个问题。
    ahu
        48
    ahu  
       2024-03-22 20:21:04 +08:00
    @Livid #47 现在试了下,的确 ok 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4358 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 00:15 PVG 08:15 LAX 16:15 JFK 19:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86