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

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

  •  1
     
  •   iorilu · 113 天前 · 7504 次点击
    这是一个创建于 113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近又把 rust 捡起来学了

    上次学了 2 个星期把

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

    我看的是 programming rust 第二版

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

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

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

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

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

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

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

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

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

    Go 没高强度用过,但体感语法糖太弱,应该没法和熟练使用的 Rust 比.
    tsanie
        36
    tsanie  
       113 天前
    @lylgb #30 .net core, publish aot +1
    Goooler
        37
    Goooler  
       113 天前
    jrqlxue
        38
    jrqlxue  
       113 天前
    [安装 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  
       112 天前   ❤️ 1
    周末把一个 go 写的小工具用 rust 重写了,用 go 写完全用的标准库,换成 rust 一共引了 200 多个 crates😥

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

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

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

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

    主要还是看你的个人喜好,以及当前项目有没有对一些技术特性有强依赖。
    w568w
        46
    w568w  
       112 天前   ❤️ 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  
       112 天前 via Android
    @w568w 补充一句:不是说 go 不好。只是这种场景下,rust 确实领先 go 太多了。
    Nasei
        48
    Nasei  
       112 天前
    @w568w 请问 rust 有什么可以同时搞定命令行和配置文件的库吗,几年前看似乎比较别扭,不知道现在怎么样了
    guanzhangzhang
        49
    guanzhangzhang  
       112 天前
    只要不是 cgo ,golang 能自带交叉静态编译,我 windows ,开发 linux 机器上,家里路由器上都有 cli tool 。
    sagaxu
        50
    sagaxu  
       112 天前
    @w568w

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

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

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

    @sagaxu 不支持,干啥都要写 For 。当然也可以自己写一个 Map 之类接受闭包的函数,但 (1) 我没找到过好用的工具包;(2) Go 的闭包函数不是零成本的,会损失性能,高性能场景慎用。
    DOLLOR
        52
    DOLLOR  
       112 天前
    @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  
       112 天前
    为什么不试试最好的语言( PHP )呢?现在可以打包成单文件执行了(狗头)
    https://static-php.dev
    PureWhiteWu
        54
    PureWhiteWu  
       112 天前
    看你的具体目标和 ROI 了。
    如果是写一个非常简单的,对性能没啥要求的,一次性的(不咋会维护迭代 or 加功能)命令行工具,那么 go 或者 python 就成,实在不行 bash 糊一下都是可以的。
    如果是要长期维护迭代的项目/重要的项目/对性能稳定性有要求的项目,那么就 Rust 吧。不说性能安全性这些,光抽象能力和表达能力都甩 Go 不知道几条街了。

    利益相关:Go 和 Rust 都写过,目前主要写 Rust 。
    a132811
        55
    a132811  
       112 天前   ❤️ 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  
       112 天前
    Go 。兼顾了开发者数量/CLI 生态/学习难度。

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