V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iorilu
V2EX  ›  Rust

rust 用来开发一些命令行程序是不是神器

  •  1
     
  •   iorilu · 2024-07-14 17:29:12 +08:00 · 10073 次点击
    这是一个创建于 415 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近又把 rust 捡起来学了

    上次学了 2 个星期把

    这次决定至少学完一本书把

    我看的是 programming rust 第二版

    主要目的是可能个人需要一些命令行程序, 虽然 python 方便, 但编译出来至少几十 m, 太大 而且编译麻烦

    rust 至少随时就编译出来了, 方便用

    57 条回复    2024-09-07 22:47:42 +08:00
    fxxkbioinfo
        1
    fxxkbioinfo  
       2024-07-14 18:35:39 +08:00
    clap 确实牛逼
    wlingxiao
        2
    wlingxiao  
       2024-07-14 18:38:48 +08:00 via Android
    命令行程序我还是推荐用 go ,rust 的编译速度实在是太慢了。
    apkapb
        3
    apkapb  
       2024-07-14 19:05:45 +08:00   ❤️ 1
    个人觉得 go 是神器
    zzhaolei
        4
    zzhaolei  
       2024-07-14 19:09:07 +08:00
    go 在这方面还是好用的
    zzhaolei
        5
    zzhaolei  
       2024-07-14 19:09:35 +08:00
    @zzhaolei #4 尤其是跨平台编译,无出其右者
    yuanmomo
        6
    yuanmomo  
       2024-07-14 19:11:12 +08:00 via iPhone
    我现在用的是 go
    powerman
        7
    powerman  
       2024-07-14 19:15:07 +08:00
    python 快啊,rust 还要考虑 ownership
    sakeven
        8
    sakeven  
       2024-07-14 19:49:07 +08:00
    @powerman python pyc 损坏处理比较麻烦,要删 pyc 文件。作为 cli 工具或者部署到大量客户端的,不太合适,维护麻烦。
    cmdOptionKana
        9
    cmdOptionKana  
       2024-07-14 19:54:34 +08:00
    go 性能够用时就用 go, 追求更高性能才用 rust 。
    DOLLOR
        10
    DOLLOR  
       2024-07-14 20:11:21 +08:00 via Android
    我推荐 dart ,也可以像 go 一样编译成一个几 MB 的可执行程序。(似乎 Google 家的东西都喜欢这样?)
    而且 dart 语法基本跟 js 、java 大同小异,容易入手。
    thedog
        11
    thedog  
       2024-07-14 20:15:00 +08:00
    啊,好多语言啊,现在有没有什么工具能够让我写 python ,然后随便调用包,然后就能随便编译成任何其他语言的
    kneo
        12
    kneo  
       2024-07-14 20:15:16 +08:00 via Android
    rust 只在高性能领域才堪堪一用。其它领域都劝退。
    w568w
        13
    w568w  
       2024-07-14 20:19:06 +08:00
    clap 确实神器。

    关于 Go ,不妨自己看看现在 Go 的 Argument Parsing 库哪个符合 GNU 规范的、哪个是在活跃维护的。每次找 CLI 相关库,一看 star 一堆,最后提交时间缺失「 4 年前」,都感觉 Go 的生态有一种垂垂老矣之相。Rust 这边就欣欣向荣多了。

    另外说 Go 跨平台编译无出其右的…… 说实话,这套说法在 Rust 出来之前我还相信,现在 Rust 的编译体验比 Go 好多了,起码不用在那里摆弄 net 和 libc 的链接问题,还有纯血 Rustls 之类的系统替代库,实现一键全静态编译。

    利益相关:臭写 Go 的,写 Go 比写 Rust 多。
    w568w
        14
    w568w  
       2024-07-14 20:19:22 +08:00
    @w568w 缺失->却是
    yplam
        15
    yplam  
       2024-07-14 20:27:33 +08:00 via Android
    如果对可执行文件大小以及内存占用有较高要求的话 Rust 的确挺合适,曾经给一个嵌入式 Linux 系统写过一个类 supervisor+OTA 功能的工具,优化后大小只有一百多 K ,用 go 的话要几 m 起步
    RedBeanIce
        16
    RedBeanIce  
       2024-07-14 20:38:37 +08:00
    go
    zjp
        17
    zjp  
       2024-07-14 20:48:50 +08:00 via Android
    像 uutils 这类 rust 重写的工具确实不少
    treblex
        18
    treblex  
       2024-07-14 21:57:44 +08:00
    Suomea
        19
    Suomea  
       2024-07-14 23:14:58 +08:00
    没有人提 C 吗
    wwqgtxx
        20
    wwqgtxx  
       2024-07-14 23:18:28 +08:00
    @w568w "摆弄 net 和 libc 的链接问题",请直接设置 CGO_ENABLE=0 ,之后就不需要摆弄了
    haoxingxing
        21
    haoxingxing  
       2024-07-14 23:20:38 +08:00
    go
    XiLingHost
        22
    XiLingHost  
       2024-07-14 23:22:31 +08:00
    @Suomea C 的工具链和开发体验太差了,而且相比于 rust 太容易写出 bug 来了
    crackidz
        23
    crackidz  
       2024-07-14 23:35:22 +08:00
    我猜你是不是想找 NodeJS...

    NodeJS 整天在重写已有的 CLI
    Evrins
        24
    Evrins  
       2024-07-14 23:40:55 +08:00
    如果只是做命令行工具的话 Golang 会更好, 语法更简单, 还支持跨平台编译
    w568w
        25
    w568w  
       2024-07-14 23:41:27 +08:00
    @wwqgtxx 是的,于是我的代码就不能通过编译了。
    jlkm2010
        26
    jlkm2010  
       2024-07-15 00:06:06 +08:00
    现在感觉 cangjie 写命令行更舒服
    tairan2006
        27
    tairan2006  
       2024-07-15 06:50:23 +08:00 via Android
    go 肯定是最简单的,如果不用 cgo

    否则最简单的一定是 zig
    charlie21
        28
    charlie21  
       2024-07-15 09:09:59 +08:00
    @DOLLOR 关于用 dart 语言写一个命令行软件 是否还需要什么额外 SDK ,请问有什么推荐零基础教程(纯 dart, 非 flutter SDK 相关的)
    iorilu
        29
    iorilu  
    OP
       2024-07-15 09:12:08 +08:00
    @Suomea 说实话, 写一个像样点真有点用程序, c 可能要十倍时间把
    lylgb
        30
    lylgb  
       2024-07-15 09:20:26 +08:00
    没人提 C#吗?
    vincent7245
        31
    vincent7245  
       2024-07-15 09:58:10 +08:00
    能学会就用 rust ,学不会就用 go
    jplay
        32
    jplay  
       2024-07-15 10:10:19 +08:00
    为什么不用 C++开发命令行程序,开发效率和产物大小都能兼顾
    easymbol
        33
    easymbol  
       2024-07-15 10:15:45 +08:00
    @w568w 有一说一,非必要我是真不想引用偏门库,主流库还能保持活跃,偏门的库就直接撂挑子了
    iorilu
        34
    iorilu  
    OP
       2024-07-15 10:29:07 +08:00
    @jplay 肯定 rust 有优势阿, 除非赚钱东西, 个人用 c++可能不合适, 一来可能没那水平, 二来没那时间
    InkStone
        35
    InkStone  
       2024-07-15 10:30:10 +08:00
    @jplay 就是因为开发效率太低了才不想用 C++。

    同样的命令行工具,我的感觉是,开发效率 Python >> Rust >> C++。长期维护时的迭代效率,Rust≈Python >> C++(这条时间越长 Rust 优势越大,C++在任何情况下都没有优势)。

    Go 没高强度用过,但体感语法糖太弱,应该没法和熟练使用的 Rust 比.
    tsanie
        36
    tsanie  
       2024-07-15 10:39:03 +08:00
    @lylgb #30 .net core, publish aot +1
    Goooler
        37
    Goooler  
       2024-07-15 10:44:23 +08:00
    jrqlxue
        38
    jrqlxue  
       2024-07-15 11:11:20 +08:00
    [安装 Visual Studio 时,建议选择几个 Windows 工作负载,例如 .NET 桌面开发、使用 C++ 的桌面开发和通用 Windows 平台开发。 你可能认为不需要全部三种,但很有可能会出现某依赖项需要全部三种,因此我们认为选择全部三种会更简单。]( https://learn.microsoft.com/zh-cn/windows/dev-environment/rust/setup)

    对于 VS 生成工具 2022 ,勾选上面 3 种后 C 盘 12.37G+安装盘 5.57G ,对于 C 盘不够大的人而言不够友好,这些是 windows 下使用 rust 的其中一个障碍(仅编译使用,不写代码)

    另外,rust 编译会有体积很大很大的中间文件残留

    Yadomin
        39
    Yadomin  
       2024-07-15 11:35:18 +08:00   ❤️ 1
    周末把一个 go 写的小工具用 rust 重写了,用 go 写完全用的标准库,换成 rust 一共引了 200 多个 crates😥

    不是很喜欢 rust crates 逐渐 node modules 化,甚至它的 target 目录比 node_modules/ 还逆天
    ty29022
        40
    ty29022  
       2024-07-15 11:38:17 +08:00
    zig is better
    standchan
        41
    standchan  
       2024-07-15 11:47:33 +08:00
    go 也不错
    vvhy
        42
    vvhy  
       2024-07-15 11:53:05 +08:00 via Android
    @Yadomin 确实,小项目几个 G 起步,中等项目一百多 GB
    kk2syc
        43
    kk2syc  
       2024-07-15 12:03:54 +08:00
    @w568w 如果功能稳定的话 4 年不更新也不是不能用
    zhouyin
        44
    zhouyin  
       2024-07-15 12:11:56 +08:00
    @Goooler
    modern unix 怎么安装
    libook
        45
    libook  
       2024-07-15 12:13:26 +08:00
    上周刚用 Rust 写了一个命令行程序,总体上中规中矩,跟其他大多技术栈区别不大。

    rust 、go 这类的编译完可以不依赖运行时,python 、perl 这类绝大多 Linux 都自带运行时,其实都还行。

    大小其实无所谓,现在硬盘都那么大了。

    编译速度其实也还好,因为用户使用的时候主要使用编译生成的可执行文件,只需要开发者发版或用户安装的时候编译一次就行了。

    主要还是看你的个人喜好,以及当前项目有没有对一些技术特性有强依赖。
    w568w
        46
    w568w  
       2024-07-15 12:28:36 +08:00   ❤️ 2
    @kk2syc 稳定是稳定,但是大多还有一堆报告不兼容性或者 bug 的 issue 没修,作者基本也摆烂了……

    另外,楼主问的是 Rust 和其他语言相比的优缺点吧?

    1. 论跨平台,静态编译方面 Rust 早就超过 Go 了。还认为「 Go 的跨平台是独家优势」的该更新更新观念了;

    2. 论易用性,Rust 有 clap 之类的神器,一键生成 help message 、schema 和类型校验,不像 Go 每个参数的解析要写一些像 python argparser 那样的 boilerplate 。而且 Go 的哲学是 verbose is better than implicit ,适合写网络解析之类的通信逻辑,对命令行工具很不友好;

    3. 论生态,Rust 的命令行解析器和 CLI 基本都在活跃更新,而且都卷出新高度了( https://github.com/rosetta-rs/argparse-rosetta-rs ,看这里,甚至在卷毫秒级的解析性能和内存占用)。

    作为被 Go 折磨的人,我实在不推荐这种需求上 Go 。
    w568w
        47
    w568w  
       2024-07-15 12:36:54 +08:00 via Android
    @w568w 补充一句:不是说 go 不好。只是这种场景下,rust 确实领先 go 太多了。
    Nasei
        48
    Nasei  
       2024-07-15 12:49:54 +08:00
    @w568w 请问 rust 有什么可以同时搞定命令行和配置文件的库吗,几年前看似乎比较别扭,不知道现在怎么样了
    guanzhangzhang
        49
    guanzhangzhang  
       2024-07-15 12:58:00 +08:00
    只要不是 cgo ,golang 能自带交叉静态编译,我 windows ,开发 linux 机器上,家里路由器上都有 cli tool 。
    sagaxu
        50
    sagaxu  
       2024-07-15 12:59:10 +08:00
    @w568w

    go 标准库现在支持 xxx.map(...).filter(...).reduce(...)这种写法了吗?还像以前那样干啥都要写 for ?

    错误处理支持 Exception 或者 Result<T, E>这种风格了吗?还是像以前一样满屏幕的 if err ...?
    w568w
        51
    w568w  
       2024-07-15 13:26:52 +08:00   ❤️ 1
    @Nasei 你是想找一个 https://github.com/spf13/viper 那样的库吧?这种大而全的库我确实没看到比较好的,clap 本身不支持,还在讨论中(虽然已经讨论 6 年了)。

    可以用 clap + config + clap_config 来做,总共也就多写一行代码。也有一些相对不流行的包实现了多来源参数合并,例如 hyperparameter 、argone 。

    @sagaxu 不支持,干啥都要写 For 。当然也可以自己写一个 Map 之类接受闭包的函数,但 (1) 我没找到过好用的工具包;(2) Go 的闭包函数不是零成本的,会损失性能,高性能场景慎用。
    DOLLOR
        52
    DOLLOR  
       2024-07-15 13:48:33 +08:00
    @charlie21

    Dart SDK 本身就可以开发命令行程序,比如简单的 HTTP 服务器,不需要 flutter SDK 之类。
    然后给你的编辑器(比如 vscode )装个语言扩展。

    纯 Dart 语言开发照着官网教程就可以
    https://dart.dev/language
    https://dart.dev/resources/dart-cheatsheet
    Dart SDK 相关
    https://dart.dev/get-dart/archive
    https://dart.dev/tools/dart-compile
    cwcc
        53
    cwcc  
       2024-07-15 13:51:53 +08:00
    为什么不试试最好的语言( PHP )呢?现在可以打包成单文件执行了(狗头)
    https://static-php.dev
    PureWhiteWu
        54
    PureWhiteWu  
       2024-07-15 13:58:13 +08:00
    看你的具体目标和 ROI 了。
    如果是写一个非常简单的,对性能没啥要求的,一次性的(不咋会维护迭代 or 加功能)命令行工具,那么 go 或者 python 就成,实在不行 bash 糊一下都是可以的。
    如果是要长期维护迭代的项目/重要的项目/对性能稳定性有要求的项目,那么就 Rust 吧。不说性能安全性这些,光抽象能力和表达能力都甩 Go 不知道几条街了。

    利益相关:Go 和 Rust 都写过,目前主要写 Rust 。
    a132811
        55
    a132811  
       2024-07-15 14:23:59 +08:00   ❤️ 1
    @w568w go 也有 urfave/cli 等工具提供一键生成 help message 、config 、type checking 。golang 算是 rust+python 的折中方案。

    @sagaxu go 泛型库 lo 可避免写 for 、interface 转换。如果想用函数式的话,可试试 ibm 的 fp-go 库。

    错误处理避免 if err 的话,可以像 bufio scan 的方法那样避免 if err 。不过平时开发一般还是 if err 简单顺手。另外错误 chain 是一定要支持,方便定位错误的调用栈
    iyear
        56
    iyear  
       2024-07-15 14:50:36 +08:00
    Go 。兼顾了开发者数量/CLI 生态/学习难度。

    至于楼上的回复,不知道 kubectl 、gh cli 、hugo 、lxc 能不能在他那算“长期维护迭代的项目/重要的项目/对性能稳定性有要求的项目”?🤔 https://github.com/spf13/cobra/blob/main/site/content/projects_using_cobra.md
    timothyye
        57
    timothyye  
       359 天前
    Rust 确实比较适合开发一些 cli 的小工具,今天又挖了个坑:
    https://github.com/TimothyYe/tcping
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3177 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 11:30 · PVG 19:30 · LAX 04:30 · JFK 07:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.