news 2026/9/18 23:31:02

Spack v1.2.0 新特性深度解读:全新并行安装器、并发配置组与安装期 SBOM 生成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spack v1.2.0 新特性深度解读:全新并行安装器、并发配置组与安装期 SBOM 生成

Spack v1.2.0 新特性深度解读:全新并行安装器、并发配置组与安装期 SBOM 生成

【免费下载链接】spackA flexible package manager that supports multiple versions, configurations, platforms, and compilers.项目地址: https://gitcode.com/GitHub_Trending/sp/spack

本指南基于 CHANGELOG.md 对 Spack 各主要版本的演进记录,聚焦最新的v1.2.0特性版本,逐一拆解重写后的并行安装器、Concretization Groups(并发配置组)、Concretization Caching(具体化缓存)、安装期 SBOM 生成、spack isolate命令与实验性 Landlock 沙箱等核心能力,并结合仓库源码(lib/spack/spack)验证其实现细节,帮助你在升级到v1.2.0后快速掌握新安装流程、配置迁移与安全加固手段。

一、版本概况与升级概览

Spackv1.2.0(2026-06-21 发布)是一个主特性版本,CHANGELOG.md 将其定位为围绕新的并行安装器大量性能改进的发布,同时引入了并发配置组(concretization groups)、实验性构建沙箱(build sandboxing)与 SBOM 生成等易用性与安全性能力。

围绕该版本,主要变化集中在以下几个方面:

领域核心变化
安装器全新并行安装器从v1.1.0的实验特性转正为默认;单线程事件驱动调度 + jobserver 动态共享工作
具体化新增 Concretization Groups(命名 spec 组,各自独立具体化);Concretization Caching 默认开启
安全安装时自动生成 SPDX 2.3 格式 SBOM;新增spack isolate命令;实验性 Linux Landlock 沙箱
弃用GPG 命令默认不再静默信任密钥;include_concrete:弃用;若干命令行选项移除

二、全新并行安装器:从实验到默认

v1.2.0v1.1.0中作为实验特性引入的新安装器设为默认。这是一个完全重写的包安装器,核心目标有二:更充分的构建并行性与更好的用户体验。

2.1 架构:单线程事件驱动调度

新安装器采用单线程、事件驱动的构建调度器,基于非阻塞 I/O。一个spack install进程即可利用 DAG 级并行性——调度器将互不依赖的包构建并发排程,而不像旧安装器那样需要为每个包单独派生调度循环。

所有并发构建共享一个由 Spack 建立的jobserver(一个 POSIX 管道),用于管理可组合并行性。这使得构建之间可以动态共享工作,直到达到作业上限:

  • 当一个包受限于单线程的 configure 阶段时,其它并行度更高的构建可以接管空余作业;
  • 数据库写入也经过了优化,从二进制缓存批量安装大量包时提速明显。

从源码结构看,新安装器位于 lib/spack/spack/installer 目录,其中 core.py 承担核心调度逻辑,schedule.py 负责构建任务排程,ui.py 实现交互式终端界面,posix.py 与 windows.py 分别提供 POSIX 与 Windows 平台的实现。

2.2 新的交互式 TUI

最直观的变化是新的交互式终端用户界面(TUI),它展示所有活跃的、并发运行的构建概览,并允许跟随特定构建的日志:

  • v:在日志与概览之间切换;
  • n:下一个日志;
  • p:上一个日志;
  • qEsc:从日志返回概览;
  • /:进入搜索模式,边输入边过滤概览;按Enter跟随日志,按Esc退出搜索。

2.3 并行度的使用方式

-j标志(spack install -j <N>)即可让包并行构建。无需设置-p,安装器默认会尽可能多地派生构建并共享工作。若希望沿用旧安装器,可回退配置;若要在v1.1.0上体验该 UI,可用以下命令启用(v1.2.0起为默认):

spack config add config:installer:new

或单次运行体验:

spack -c config:installer:new install ...

三、Concretization Groups:单个环境内的命名 spec 组

v1.2.0引入Concretization Groups(并发配置组),允许一个环境内存在带有各自局部具体化偏好与依赖关系的命名 spec 组,从而在一个spack.yaml中控制具体化顺序,此前这类工作流往往需要拆分为多个环境。

3.1 控制具体化顺序(引导编译器场景)

若需要先引导编译器再用它构建应用,可这样组织:

spack: specs: - group: compiler specs: - gcc@15.2 - group: apps needs: [compiler] specs: - hdf5 %gcc@15.2 - libtree %gcc@15.2

apps组通过needs: [compiler]声明对compiler组的依赖,组间形成明确的具体化顺序。

3.2 为不同组提供不同目标/变体偏好

也可为特定组提供不同的 target、variant 或其它偏好:

spack: specs: - group: apps-x86_64_v3 specs: - gromacs - quantum-espresso override: packages: all: prefer: - target=x86_64_v3 - group: apps-x86_64_v4 specs: - gromacs - quantum-espresso override: packages: all: prefer: - target=x86_64_v4

每个组被独立具体化,来自依赖组的 concrete specs 会包含进每个组的求解中(solve)。这意味着你可以仅用一个环境,同时产出面向x86_64_v3x86_64_v4的两套构建产物。

四、Concretization Caching:默认开启的求解缓存

v1.1.0以实验特性引入的concretization caching(具体化缓存)在v1.2.0默认开启。Spack 现在会缓存具体化结果,并能检测何时两次求解会产生相同结果。例如:

spack spec hdf5 spack install hdf5

现在只需真正求解一次hdf5,第二次直接命中缓存,显著减少重复求解的等待时间。

从源码看,缓存的读取与写入逻辑位于 lib/spack/spack/solver/asp.py(solve()方法在L800附近按配置决定是否走缓存),缓存根目录、条目上限等由concretizer:concretization_cache:urlconcretizer:concretization_cache:entry_limit配置控制(默认条目上限 1000,见L3480-3488)。若需在旧版本上显式开启,可用:

spack config add concretizer:concretization_cache:enable:true

五、安装期 SBOM 生成:SPDX 2.3 软件物料清单

软件物料清单(SBOM)是列出安装所包含组件、依赖与许可证的标准化文件,可被安全工具消费与分析,用于检测 CVE 及其它软件合规问题。v1.2.0起 Spack 在安装时自动生成 SPDX 2.3 SBOM

  • 存放位置:$prefix/.spack/sbom目录($prefix为包的安装前缀);
  • 内容标准:目前包含NTIA 最小要素(供应商、组件名、版本、唯一标识、依赖关系),信息取自 Spack 元数据。

源码实现位于 lib/spack/spack/hooks/sbom_generate.py:

  • post_install()钩子(L203-204)在安装完成后触发generate_spdx_2_3(spec)
  • generate_spdx_2_3()L138-199)构建 SPDX 文档:顶层包作为DESCRIBES关系的被描述对象,每个依赖作为独立Package条目,通过CONTAINS关系与顶层组件关联;
  • 条目信息由make_spdx_2_3_package_entry()L108-120)生成,包括SPDXID、名称、版本、供应商、下载位置、声明许可证(来自license()指令元数据)、SHA256/SHA1 校验和等;
  • 外部包(spec.external)会跳过 SBOM 生成(L140-141)。

生成的文件为spdx-2.3.json,采用 SPDX-2.3 规范,文档命名空间基于spec.dag_hash(),保证每个安装的唯一性。

六、新命令:spack isolate

spack isolate提供了一种将单个 Spack 实例与~/.spack隔离的机制:它修改当前 Spack 实例,将user配置作用域指向自定义路径,并通过一个isolate配置作用域把默认位于~/.spack的缓存与 stage 目录一并迁移到自定义位置。

6.1 三种用法

# 1. 只写入 Spack 自身前缀($spack 目录) spack isolate --self # 2. 只写入自定义路径 spack isolate --path PATH # 3. 撤销隔离,恢复内部配置 spack isolate --undo

从源码看(lib/spack/spack/cmd/isolate.py),isolate通过在 Spack 的include.yaml配置中插入一个名为isolate的作用域(ISOLATE_SCOPE_PATH,位于$spack/etc/spack/isolate)来实现,同时会把 bootstrap、config、repos 相关配置重定向到新用户路径(_isolate_bootstrap_config_isolate_config_config_isolate_repos_config)。--undo会读取隔离前保存的include.yamlPRESERVED_INCLUDE_PATH)恢复原状。该命令对 CI 或多实例部署中避免本地配置污染尤其有用。

七、实验性沙箱:Linux Landlock

v1.2.0增加了对Linux Landlock作为沙箱的实验性支持。Landlock 是相对较新的内核特性(5.13+),允许进程进一步自我限制文件系统的读/写/执行权限:

  • 它是不需要 root 权限或非特权 namespace 支持(容器运行时通常依赖)的轻量级系统调用;
  • 对 Spack 而言,Landlock 可以拒绝除构建 stage 与安装前缀之外所有目录的写访问,同时只给构建 stage 与依赖前缀读/执行权限;
  • 用户还可以指定额外的可执行文件、库与目录为可读、可写或可执行。

官方计划在 Spackv1.3中让沙箱默认开启,以实现完全可复现、隔离、非特权构建。注意这是实验性能力,需要内核支持 Landlock(5.13+)。

八、弃用与潜在破坏性变更

升级到v1.2.0前应关注以下行为变化:

  • GPG 命令不再默认静默信任密钥:现在需要--yes-to-all参数,否则会交互式询问是否信任(#52430);
  • 弃用spack gpg verifyspack gpg sign(#52431);
  • spack install弃用--dont-restage(#51604);
  • main.py弃用--pdb并移除 SIGINT 处理器(#52281)、弃用--profile标志(#52301);
  • spack compiler移除已弃用的--mixed-toolchain选项(#51726);
  • include_concrete:弃用,改用include: [spack.lock](#51900)。

九、其它值得注意的改进

9.1 核心开发

  • spack style改用ruff替代 flake8、isort 与 black(#52156);
  • 提供 Python 3.14 的 bootstrap 二进制(#51580)。

9.2 求解器与具体化器

  • 对不存在与已弃用的版本提前报错(#51555);
  • 改进版本约束错误信息(#51926)、移除求解器内部错误(#51642);
  • 求解器支持clingo v6(#52411);
  • 更偏好"最佳编译器"而非对变体无惩罚的编译器(#52109);
  • 按哈希匹配 glibc 约束(#51559);
  • 非默认变体值下的确定性具体化(#51780);
  • 排除 externals 的弃用惩罚(#51764)等。

9.3 性能优化

  • views:symlink 场景下折叠唯一子树(#52135);
  • 求解器:简化版本编码(#51591)、手工优化 trigger_node 投影(#51605)、优化模型编码(#51612)、减少satisfied/2事实的 grounding 规模(#51625)、提高 trigger/effect 缓存命中率(#51863)、改进版本与变体编码(#51872、#51988);
  • asp.py不再对pkg.dependencies与 versions 排序(#51632);
  • Git Fetch 对单提交优化 clone(#51577);
  • ctest_log_parser.py更快且顺序执行(#52249);
  • setup-env.sh在无 module 命令时加速(#52245)。

9.4 UI 与命令

  • 支持从二进制缓存(mirrors)包含/排除 specs(#52371);
  • spack config新增--group选项(#52025);
  • 新增spack location --view(#52177);
  • 日志解析器支持tail -n风格(#52279);
  • spack repo remove允许从未指定作用域移除(#51563);
  • spack repo list支持--json机器可读输出(#51950);
  • spack repo新增show-version-updates命令(#52170);
  • spack concretize等命令在包未安装但可从二进制缓存获得时显示[b]标记(#52493)。

9.5 显著 Bug 修复

  • 其它 spack 进程正在安装时不再提前停止(#51539);
  • macOS 允许安装来自更旧 OS 的二进制(#52390);
  • 求解器按语言禁用编译器混用(#51796);
  • 修复多个 intel-oneapi-compilers 版本共存的问题(#52441);
  • 修复条件性语言依赖问题(#51692)等。

十、Package API 版本

v1.2.0支持Package APIv2.5,各版本差异:

  • v2.5:包可使用hip-langcuda-lang虚拟依赖;
  • v2.4:包可包含带%%的 specs(官方不推荐);
  • v2.3version()支持git_sparse_paths参数;
  • v2.2:随 Spackv1.0发布。

注意:2026.06.0包发布版仍使用v2.2(与 Spackv1.0兼容),当开始使用更新的特性时包仓库版本才会提升。

十一、版本演进速览:从 v1.0 到 v1.2 的关键能力

为帮助理解v1.2.0在更长时间线中的位置,以下是 CHANGELOG.md 中近几个主版本的核心脉络:

版本发布日期核心主题
v1.2.02026-06-21并行安装器转正、Concretization Groups、缓存默认开启、SBOM、isolate、Landlock 沙箱
v1.1.02025-11-14编译器控制与 unmixing、可配置配置作用域、git includes、externals 支持依赖、实验性新安装器 UI 与缓存
v1.0.02025-07-20编译器依赖模型、稳定 Package API、独立包仓库、内容寻址 build cache、并发包构建
v0.23.02024-11-13语言虚拟依赖、spec splicing、变体传播、命名空间查询
v0.22.02024-05-12编译器运行时依赖(gcc-runtime)、--reuse默认化、redistribute()指令
v0.21.02023-11-11条件链错误信息、OCI build cache、多版本构建依赖、虚拟依赖挑选
v0.20.02023-05-21requires()指令、精确版本@=、新测试接口、Release 构建类型
v0.19.02022-11-11包需求、多构建系统、编译/变体传播、git 版本增强
v0.18.02022-05-28--reuse默认化、细粒度哈希、unify:when_possible、Windows 初步支持
v0.17.02021-11-05clingo 新具体化器默认化、二进制引导、--reuse引入、git commit 版本
v0.16.02020-11-18实验性 clingo 具体化器、spack test/spack develop、环境级并行
v0.14.02020-02-23分布式构建、spack ci流水线、spack containerize
v0.13.02019-10-25环境/视图、微架构目标、spack stacks、spack dev-build
v0.12.02018-11-13Spack 环境与spack.yaml/spack.lock
v0.11.02018-01-17可重定位二进制包(buildcache)、Python 3 支持、多值变体
v0.10.02017-01-17层级配置作用域、构建/链接/运行三种依赖类型、buildcache 雏形

十二、结语与升级建议

v1.2.0代表了 Spack 安装体验与安全能力的一次重要升级:新并行安装器默认启用,配合 jobserver 动态共享与默认开启的具体化缓存,让大规模环境构建更快、输出更可读;Concretization Groups 让单环境承载多目标、多偏好的复杂部署成为可能;安装期 SBOM 与spack isolate、Landlock 沙箱则分别从供应链可见性、实例隔离与构建安全三个维度加固了 Spack 的日常使用。

升级前建议重点核对第八节列出的弃用与破坏性变更(尤其是 GPG 信任行为与include_concrete:的替换),并利用本仓库的源码路径(如 lib/spack/spack/installer/core.py、lib/spack/spack/hooks/sbom_generate.py、lib/spack/spack/cmd/isolate.py)按需深入了解各新特性的实现细节,以便平滑完成迁移并充分利用新能力。

【免费下载链接】spackA flexible package manager that supports multiple versions, configurations, platforms, and compilers.项目地址: https://gitcode.com/GitHub_Trending/sp/spack

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 23:30:51

VoiceStudio:本地优先的可复现音频处理流水线

1. VoiceStudio 到底在解决什么问题VoiceStudio 这个名字&#xff0c;我最早是当成一个内部工具代号来用的——手上堆着几十条采访录音、一批课程口播、还有几段需要反复调的作品&#xff0c;全靠 ffmpeg 一把梭加上手工点音频软件&#xff0c;一条音频折腾半小时是常态。后来我…

作者头像 李华
网站建设 2026/9/18 23:30:40

uv实战指南:Python包管理的物理加速器

1. 为什么现在该认真看看 uv&#xff1a;它不是另一个 pip&#xff0c;而是 Python 包管理的“物理加速器”最近三个月&#xff0c;我在三个不同规模的 Python 项目里——一个面向金融风控的实时特征计算服务、一个嵌入式设备上的轻量级模型推理脚本、还有一个需要在国产化信创…

作者头像 李华
网站建设 2026/9/18 23:28:01

图片文本分析 API,TaoToken 让 Agent 在 public-apis 做初筛

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华