iorilu
V2EX  ›  Rust

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

  •  1
     
  •   iorilu · Jul 14, 2024 · 12953 views
    This topic created in 842 days ago, the information mentioned may be changed or developed.

    最近又把 rust 捡起来学了

    上次学了 2 个星期把

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

    我看的是 programming rust 第二版

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    至于楼上的回复,不知道 kubectl 、gh cli 、hugo 、lxc 能不能在他那算“长期维护迭代的项目/重要的项目/对性能稳定性有要求的项目”?🤔 https://github.com/spf13/cobra/blob/main/site/content/projects_using_cobra.md
    timothyye
    timothyye
    Sep 7, 2024
    57
    Rust 确实比较适合开发一些 cli 的小工具,今天又挖了个坑:
    https://github.com/TimothyYe/tcping
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5331 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 178ms · UTC 01:52 · PVG 09:52 · LAX 17:52 · JFK 20:52
    ♥ Do have faith in what you're doing.