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

2024-07-14 17:29:12 +08:00
 iorilu

最近又把 rust 捡起来学了

上次学了 2 个星期把

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

我看的是 programming rust 第二版

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

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

10087 次点击
所在节点    Rust
57 条回复
standchan
2024-07-15 11:47:33 +08:00
go 也不错
vvhy
2024-07-15 11:53:05 +08:00
@Yadomin 确实,小项目几个 G 起步,中等项目一百多 GB
kk2syc
2024-07-15 12:03:54 +08:00
@w568w 如果功能稳定的话 4 年不更新也不是不能用
zhouyin
2024-07-15 12:11:56 +08:00
@Goooler
modern unix 怎么安装
libook
2024-07-15 12:13:26 +08:00
上周刚用 Rust 写了一个命令行程序,总体上中规中矩,跟其他大多技术栈区别不大。

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

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

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

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

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

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

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

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

利益相关:Go 和 Rust 都写过,目前主要写 Rust 。
a132811
2024-07-15 14:23:59 +08:00
@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
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
361 天前
Rust 确实比较适合开发一些 cli 的小工具,今天又挖了个坑:
https://github.com/TimothyYe/tcping

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1057211

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX