LWN:在Fedora中打包Rust应用!

Linux下Rust快速安装与VSCode高效开发环境搭建指南 本文提供了一份详尽的Linux下Rust安装与VSCode开发环境配置指南。通过配置国内镜像加速rustup安装,并详细介绍了VSCode必备插件(如rust-analyzer)的安装与优化设置,帮助开发者快速搭建高效、流畅的Rust开发工作流,有效提升编码与调试效率。 阅读详情

关注了就能看到更多这么棒的文章哦~

Packaging Rust for Fedora

By Jonathan Corbet
October 28, 2022
DeepL assisted translation
https://lwn.net/Articles/912202/

Linux 发行版设计的时候,当时的通用原则是用 C 语言来写程序,因此人们所关心的大多数软件都是用 C 语言编写的。发行版也就自然而然地可以高效打包发布 C 语言应用程序以及它们所依赖的库了。然而,现代语言往往是围绕着他们自己的打包管理系统(package-management systems)来设计的,这些系统的设计目标各有差异。于是多年来,发行版提供方一直在针对用这些语言编写的应用程序来寻找最佳打包和发布方式。最近在 Fedora 社区进行的关于 Rust 应用程序打包方式的讨论表明,这些问题还没有全部解决。

引起这次讨论的是 Panu Matilainen 提出的一个针对 Fedora 38 的修改建议。RPM 软件包管理器长期以来一直使用自己内部 OpenPGP 解析工具(parser)来管理软件包的密钥和签名。这个解析工具似乎没有人喜欢;在这个提案中它被描述为 "因其局限性和缺陷而臭名昭著",并提出了一个计划来用 Sequoia 库取代它,该库是用 Rust 编写的(2020 年曾在 LWN 介绍过)。使用 Rust 可以提供一些 safety 保证,因此在这种跟安全相关的代码中是很受欢迎的,但对于担心 Rust 如何融入整个发行版的开发者来说,它也可能是一个显眼的标志。

不可避免地,有人对这个提议提出了抱怨。例如,Kevin Kofler 就问为什么不选择用 C 语言编写的库。据 Matilainen 说,已经花了很多年来寻找这样的库,但是一直没有成功。最明显的替代方案,GPGME,是不能满足要求的,因为它是围绕着与外部 GPG 进程的通信而建立的,"这种配置,你肯定不希望在 rpm 环境下(比如频繁进行 chroot 等)看到"。Neal Gompa 同意 GPGME 工作模式在这种环境下会很难用,并且似乎同意没有比 Sequoia 更好的选择,尽管他自己跟 Rust 社区有不少分歧:"所以我们现在就是这么个情况,处于一个由糟糕的工具造成的不舒服的情况,因为反正没有多少人非常关心 security"。

Kofler 继续概述了他认为 Rust 语言存在的问题。其中一个是,它是又一种需要处理的语言,这个抱怨在名单上并没有引起很多人的共情。不过,他的另一个反对意见则让大家更加感同身受:

我认为 Rust 最糟糕的问题是库文件的 "打包" 方式,这意味着要为每个应用程序安装源代码并重新编译。(结果是,输出文件显然要被静态链接到应用程序中,也就具有了静态链接所有的缺点)。我认为一种没有可以使用的共享库(shared library)支持的语言是完全不可以打包发布的,因此完全没有价值。

Fabio Valentini 负责为 Fedora 打包 Rust crates,他指出 Sequoia 实现为一个具有 C ABI 的共享库,因此不需要将什么 Rust 代码静态链接到 RPM 中。他询问 Kofler 是否有任何建设性的建议来改善这种情况。Kofler 的答复中没有给出正面回应。不过,Fedora 项目负责人 Matthew Miller 确实有一些想法。

具体来说,他同意 Kofler 的观点,即 Rust 应用程序最终可能完全是 "不可打包发布的"。他提到了他在 Bevy 游戏引擎方面所做的工作;他发现调用 Cargo 构建系统来获取 Bevy 的构建依赖项会获取超过 390 个独立的 crate,其中大约一半是目前没有在 Fedora 中打包发布的。试图对这样一个应用程序打包发布,肯定是很痛苦的,但是,他说,"开源胜利之后的世界就是这样的"。Cargo 使软件组件的共享和重用变得容易,这是一个很大的好处,但它使所有这些依赖关系的独立打包发布变得更加困难。事实上,这些依赖关系中有许多是依赖相关 crack 的特定版本的,这使得这个任务更加困难。

所有这些,都使他质疑为 Fedora 打包 Rust crate 的工作的价值。他也有与众不同的想法,认为 Rust 可能是一个探索使用新的方法的机会。他说:"有些东西是轻量级的,我们可以在构建应用程序 RPM 的过程中 直接 使用它们"。他的意思很明显,就是不试图打包所有的依赖关系,也不发布动态链接的可执行文件,这样 Fedora 可以更直接地跟 Cargo 生态系统配合起来,节省大量(在他看来)没有多少价值的工作,并且更容易将应用程序推广给用户。他总结说,Fedora 需要适应当前的开发环境,从而让自己保持不被抛弃。

应该不会有多少读者对 Valentini 反对这个观点感到惊讶。他说,Bevy 是一个有点特殊的情况;大多数 Rust 应用程序相对比较容易在 Fedora 中打包发布,因为最流行的那些 crack 已经打包好了。他补充说,Cargo 和 RPM 的工作方式很类似,这使得打包工作更容易;在许多情况下,RPM spec 文件可以直接根据 Cargo metadata 来自动生成。同时,打包工作带来了人们已经习惯了的所有优势,包括跨架构的测试、代码和 license review,以及将贡献推送到 upstream 从而使未来的打包工作更容易。

他说,试图改变 Rust 应用程序的打包过程,反而会使事情变得更糟。他说,这就是 Node.js 和 Java 面临的问题(6月时 LWN 曾报道过一些 Java 的讨论)。他总结说,总的来说,Rust 的情况相对较好,如果试图做一些不使用 "纯粹 RPM 包" 的事情,可能会造成更多的问题,而不是解决问题。

ofler 则不赞同这个 Rust 可以更加容易地添加依赖关系的观点,称这里得到的是 "dependency hell(依赖地狱)"。他说,与其说是 Fedora 适应了 Rust,不如说是 Rust 为了避免被抛弃而应该要努力适配 Linux 发行版。不过 Gompa 不太认为事情会按这个方向走,他说他在这个方向的努力在过去遇到了很大的阻力。

谈话到此结束,没有任何明确的结论。有一个相关的问题没有得到解决,但值得考虑,并且在 RPM 中使用 Sequoia 的时候也得到了强调。只要开发者坚持使用相关的语言,跟特定语言相关的环境就能很好地工作;当面临需要将多种语言编写的代码结合在一起时,它们就很难坚持住了。目前使用的发布方式,试图使所有软件包都能很好地配合起来共同工作,展示出了它的价值。鉴于 Rewrite The World In Rust 项目注定要花几年时间才能得出最终结论,看来在一段时间内,这些混合了多种语言的应用程序的数量可能会增加,而发行版提供商则需要能够打包和发布这些应用程序。

就目前而言,为 Fedora 打包 Rust crate 的做法可能会继续下去,不会有重大变化。但发行版以及特定语言软件包管理器之间的配合的话题,估计也必定会在未来经常出现。不是很容易能找到一种方法让这些独立的生态系统可以顺利地互动,但如果可以的话,对所有参与者都有好处。这是一个值得努力解决的问题。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

format,png

Windows 11下Codex沙箱访问WindowsApps目录权限问题解决方案 在Windows系统权限管理中,ACL(访问控制列表)是控制文件和目录访问的核心机制。WindowsApps目录作为Windows Store应用的安装位置,默认由TrustedInstaller账户独占控制权限,这种设计确保了系统安全性。当开发工具如Codex沙箱需要访问这些受保护目录时,权限冲突便成为常见问题。通过PowerShell的icacls命令和ACL配置,可以精确控制目录访问权限。在企业级开发环境中,合理配置SeInteractiveLogonRight等登录权限,结合组策略管理,既能保障系统 阅读详情

相关推荐

如何在 Fedora 上安装 Rust?

Rust是一门现代的系统级编程语言,具有内存安全、并发性和高性能的特点。在Fedora上安装Rust是一项简单的任务,本文将为您提供详细的步骤和指导。

网络技术联盟站 371

Rust Web入门(八):打包发布

本教程笔记来自 杨旭老师的 rust web 全栈教程,项目的源代码可以查看 git:(注意作者使用的是 mysql 数据库而不是原教程的数据库) https://github.com/aiai0603/rust_web_mysql 这是本教程的最后一节,我们将把我们之前编写的项目进行打包发布:

weixin_46463785的博客 2720

resources_package:使用Rust语言将可执行文件中的文件打包

此板条箱允许您将几个文件打包在可执行文件中。 这类似于include_bin! 但是当您有很多文件时更易于使用。 用法: #![feature(phase)] #[phase(plugin)] extern crate resources_package; extern crate resources_package_package; static package: resources_package_package :: Package = resources_package! ([ "path/to/resources" , "other/path/to/resources" ]); fn main () { for & ( ref name, content) in package. iter () { println! ( "{}" ,

rust liunx 下打包成静态单体(像golang一样,无依赖)

在linux下打包成静态单体,第一种方式就是加上的编译目标--target参数,--target的值可以用rustup target list查看 cargo build --release --target=x86_64-unknown-linux-musl 还可以用docker容器的方案来打包静态单体。官方rust镜像https://hub.docker.com/_/rust/ 里面有一些如何使用。这里只介绍我用到方式: docker run --rm --user "$(id -u)"...

u013195275的博客 2870

基于一维卷积神经网络对机械振动信号进行分类并加以预测

基于一维卷积神经网络对机械振动信号进行分类并加以预测 *使用一维卷积神经网络训练振动信号进行二分类 2020年7月16日,一学期没等到开学,然而又放假了。 总览优快云中大多数卷积神经网络都是对二维图片进行分类的,而图片也都是常见的猫狗分类,minst手写数字分类。一维卷积神经网络的使用非常少见,有也是IDMB情感分类,和鸢尾花分类的。 作者研究生就读于河北一所双飞,全国排名270多,哈哈哈,不吹不黑。 在网上翻来翻去找不到一篇可以利用的代码去研究我的机械故障诊断,后来在无奈下到某宝搜寻到一段代码,可以利用

qq_45714906的博客 1万+

LABVIEW学习之MODBUS-TCP通讯

LABVIEW学习之MODBUS-TCP通讯 1,MODBUS-TCP通讯介绍: MODBUS通讯是工业上面经常用到的一种通讯协议。该协议的原理及介绍不在此累述,下面直接介绍LABVIEW对此协议的应用。 2,MODBUS通讯所需的函数: 安装了DSC模块之后可以在数据通信内找到相关函数 3 ,主VI 主要思路就是使用状态机来进行连接 读取 写入 断开。使用枚举类型来选择状态: 1,连接 2,写入多个M继电器: 3,写入单个M继电器 4,写入双字节D...

风动9527的博客 2万+

rust程序打包成最小docker镜像

Dockerfile文件内容。 FROM alpine:latest LABEL author.name="qwsaedac" COPY connect /connect ENV APP_HOME=/connect WORKDIR /connect ENTRYPOINT ["./frame-ioc"] 这里有个坑,但网上很多文章都没有说出来,就是你编译的rust程序要是静态单体的,因alpine这个基础镜像只有5MB左右,是不可能就什么动态系统库让你依赖使用的(这坑还是我换成ce...

u013195275的博客 2206

CGNS快速入门到实战(二):VS配置调用CGNS静态链接库

CGNS快速入门到实战这一系列分成三篇文章展开叙述,具体有:(一)CGNS静态链接库编译;(二)VS配置调用CGNS静态链接库;(三)CGNS文件及案例展示。本篇文章重点讲述VS配置调用CGNS静态链接库。

ahang_99的博客 2616

Rust入门(十):项目发布

rust入门,讲述了使用rust配置发布信息,并且将项目发布到社区

weixin_46463785的博客 1344

告别机床‘卡顿’!用C语言在STM32上实现连续小线段速度前瞻(附开源代码)

本文详细介绍了如何在STM32上使用C语言实现工业级连续小线段速度前瞻控制器,解决机床运动控制中的卡顿问题。通过轻量级算法框架设计和混合精度计算策略,显著提升加工效率和表面质量。文章包含开源代码和实战案例,帮助开发者快速掌握速度前瞻规划算法在嵌入式系统中的应用。

weixin_42571738的博客 185

Windows下飞桨PaddlePaddle 2.6.1 GPU版环境搭建全攻略(含CUDA 11.7配置避坑指南)

本文详细介绍了在Windows系统下搭建飞桨PaddlePaddle 2.6.1 GPU版环境的完整流程,特别针对CUDA 11.7和cuDNN的安装提供了避坑指南。从Anaconda环境配置、CUDA Toolkit安装到飞桨GPU版的验证,手把手帮助开发者高效完成深度学习环境搭建,解决常见问题并优化性能。

x8y9z0的博客 1094

关于rustdesk源码二次改造并编译打包的问题

因为向日葵等远程软件存在文件传输不稳定,限速等问题,公司要求对开源软件rustdesk下手(我也是第一次接触。。),于是我便开始研究。

小趴菜的博客 1万+

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1145

rust + bevy 实现小游戏 打包成wasm放在浏览器环境运行

【代码】rust + bevy 实现小游戏 打包成wasm放在浏览器环境运行。

weixin_45485922的博客 1388

Android安全支付(1)-整体架构-keymint

(1)接口定义hardware/interfaces/security/keymint/aidl/android/hardware/security/keymint/IKeyMintDevice.aidl。keymint是keymaster v4之后的替代设计。所以android 15上最好采用keymint的接口进行硬件功能的对接。同时,我们会集成一款紫光的芯片。3.可以用keyStore.getKey()来获取存储在keyStore中的数据进行加密和解密。四、关于keymint的接口定义和具体实现。

Android系统开发-VR OS-系统安全隐私 1767

python实现MACD策略背离点的判断 (附完整源码)

python实现MACD策略背离点的判断 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 665

Rust 环境搭建

本文详细介绍了在Windows、macOS和Linux系统上搭建Rust开发环境的完整流程。主要内容包括:通过rustup工具安装Rust编译器(rustc)和包管理器(cargo);各平台特有的依赖安装(如Windows的C++构建工具);环境变量配置;创建和运行首个Rust项目的方法;以及推荐的开发工具配置(VS Code+rust-analyzer)。文章还提供了版本管理、网络优化和常见问题解决方案,适合不同水平的开发者快速上手Rust编程。

likuoelie的博客 1132

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

告别 “安装失败”!Rust 环境配置避坑指南,新手也能一次成功

❌ “链接器未找到”❌ “下载速度慢/超时”❌ “Visual Studio 版本不对”❌ “cargo 命令不存在”别担心!这篇文章手把手带你避开所有坑,一次性配置成功!✨三个关键点Windows 必须安装 C++ 工具链配置国内镜像提升速度使用 rust-analyzer 提升体验。

2401_87848736的博客 971

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Rust学习指南(一)安装RUST后台管理框架

Rust安装非常简单,只要将Visual Studio的或者Visual Stuido 2022的构件工具安装即可。当被问及要安装哪些内容时,请确保已选择 “C++ build tools”,并包括 Windows 10 SDK 和英文语言包。具体可以参考这个图:最后下载,rusttup-init.exe即可。

astra_zhao的专栏 2158

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Fedora38的新改进:GCC 工具链更新计划

GCC 13 是一个重大更新,引入了 Rust 和 Modula-2 语言前端、AMD Zen 4 “znver4” 支持、其他新的 CPU target、添加的各种 C 和 C++ 语言功能,以及大量其他更新。GCC 13 是一个重大更新,引入了 Rust 和 Modula-2 语言前端、AMD Zen 4 “znver4” 支持、其他新的 CPU target、添加的各种 C 和 C++ 语言功能,以及大量其他更新。目标是跟踪和过渡到 GNU 工具链的最新组件。

u014389734的博客 746

【Rust日报】Warp 终于支持 Linux!

Warp 终于支持 Linux!Warp 是一款现代化的终端工具,最初在 MacOS 上发布后备受好评。自从上线以来,Linux 支持一直是 Warp 的最高票功能请求。现在,Linux 用户可以在 Ubuntu、Fedora、Arch Linux 或 RedHat 等发行版上安装 Warp。Warp for Linux 的特性与 Mac 版本非常相似,包括:基于 Rust 编写,所有图形渲染都直...

Rust语言学习交流 849

使用 rustup 管理你的 Rust 工具链

这提供了一个稳定版的Rust工具链,如果你是Rust的初学者,并想尝试编译和运行简单的程序,它会非常有用。要试用这些功能,你需要安装这些较新版本的工具链,而不会影响系统上的稳定版本。不幸的是,你的发行版的包管理器在这里无法做到。它受欢迎的原因之一是Rust提供的令人惊叹的工具,使其成为开发人员使用的乐趣。假设一个新版本的Rust发布了,其中包含一些有趣的特性,并且你想要获取最新版本的Rust。Rust是一种正在积极开发中的令人兴奋的语言。上安装Rust,你可以使用你的包管理器。...

Free雅轩的博客 1060

【Rust 笔记】13-迭代器(上)

【Rust 笔记】13-迭代器(上)

feiyan的博客 522

从COSCon‘25看开源年会十年进化:从极客聚会到行业坐标

开源作为数字时代的基础协作模式,正在从极客圈走向产业核心。其本质是通过开放源码、透明协作与社区治理,让分散的个体能高效共建复杂技术系统。理解开源的价值不能只停留在代码共享,更在于它重塑了技术传播、人才培养与商业协作的路径。如今,开源项目已深度渗透到云计算、人工智能、操作系统等关键领域,成为企业数字化转型的重要底座。在此背景下,开源开发者大会成为观察行业风向与连接同路人的关键场景。COSCon’25第十届中国开源年会正是这一趋势的缩影,它既展示了开源生态的成熟度,也通过高质量议程、动手实践与社区互动,为开发者

weixin_34009794的博客 417

rust交叉编译linux,Fedora31 rust 交叉编译环境

原打算在Fedora31环境中打包cargo build release, 直接放到 centos7 中运行.但实操中, 发现目标机的openssl 和glibc版本不一致, 每台主机都去独立安装的话体验十分不好.原因大概是cargo build 使用了动态库链接, 所以生成的包, 会对环境的库有很强关联解决方法当然还是有的, 既然不确定运行系统的动态库版本, 那么我们就来打一个静态库试试, 而且...

weixin_39702483的博客 367

Rust dependencies依赖管理crates.io原理梳理

1. 背景知识 本文针对的是Cargo 1.37版本。 Rust项目的依赖主要在Cargo.toml文件[dependencies]段落中定义,常见的依赖方式有: 基于rust官方仓库crates.io,通过版本说明来描述; 基于项目源代码的git仓库地址,通过URL来描述; 基于本地项目的绝对路径或者相对路径,通过类Unix模式的路径来描述。 [dependencies] typemap = "0.3" #基于rust官方仓库crates.io plugin = "0.2*" #基于rust官方仓库c

mutourend2010@gmail.com 8665
上一篇: LWN:使用blksnap抓取块设备的快照!
下一篇: LWN:继续等待安全模块堆叠!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值