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.0将v1.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:上一个日志; - 按
q或Esc:从日志返回概览; - 按
/:进入搜索模式,边输入边过滤概览;按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.2apps组通过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_v3与x86_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:url与concretizer: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.yaml(PRESERVED_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 verify与spack 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-lang与cuda-lang虚拟依赖;v2.4:包可包含带%%的 specs(官方不推荐);v2.3:version()支持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.0 | 2026-06-21 | 并行安装器转正、Concretization Groups、缓存默认开启、SBOM、isolate、Landlock 沙箱 |
| v1.1.0 | 2025-11-14 | 编译器控制与 unmixing、可配置配置作用域、git includes、externals 支持依赖、实验性新安装器 UI 与缓存 |
| v1.0.0 | 2025-07-20 | 编译器依赖模型、稳定 Package API、独立包仓库、内容寻址 build cache、并发包构建 |
| v0.23.0 | 2024-11-13 | 语言虚拟依赖、spec splicing、变体传播、命名空间查询 |
| v0.22.0 | 2024-05-12 | 编译器运行时依赖(gcc-runtime)、--reuse默认化、redistribute()指令 |
| v0.21.0 | 2023-11-11 | 条件链错误信息、OCI build cache、多版本构建依赖、虚拟依赖挑选 |
| v0.20.0 | 2023-05-21 | requires()指令、精确版本@=、新测试接口、Release 构建类型 |
| v0.19.0 | 2022-11-11 | 包需求、多构建系统、编译/变体传播、git 版本增强 |
| v0.18.0 | 2022-05-28 | --reuse默认化、细粒度哈希、unify:when_possible、Windows 初步支持 |
| v0.17.0 | 2021-11-05 | clingo 新具体化器默认化、二进制引导、--reuse引入、git commit 版本 |
| v0.16.0 | 2020-11-18 | 实验性 clingo 具体化器、spack test/spack develop、环境级并行 |
| v0.14.0 | 2020-02-23 | 分布式构建、spack ci流水线、spack containerize |
| v0.13.0 | 2019-10-25 | 环境/视图、微架构目标、spack stacks、spack dev-build |
| v0.12.0 | 2018-11-13 | Spack 环境与spack.yaml/spack.lock |
| v0.11.0 | 2018-01-17 | 可重定位二进制包(buildcache)、Python 3 支持、多值变体 |
| v0.10.0 | 2017-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),仅供参考