ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Pixi 内联包定义(Inline Package)实战:在源依赖上直接声明构建配置

Pixi 内联包定义(Inline Package)实战:在源依赖上直接声明构建配置 开发工具CLI包管理器任务调度【免费下载链接】pixiPowerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem.项目地址https://gitcode.com/gh_mirrors/pi/pixi点击查看免费下载本文聚焦 pixi 的inline package definition内联包定义特性当源依赖指向的目录或仓库没有自带pixi.toml清单时你可以把包的构建定义直接写在依赖声明上无需额外维护一个独立清单文件。读完本文你将掌握内联包定义的启用前提、完整 TOML 语法、字段约束源码位置与包名如何继承、允许出现的位置以及 pixi 解析器在底层如何剥离、校验并指纹化这些内联定义。内联包定义解决什么问题pixi 中的**源依赖source dependency**通常指向一个包含自身[package]段的目录或仓库。pixi 读取该清单pixi.toml从中获知如何构建这个包# 常规做法依赖指向一个自带 pixi 清单的仓库/目录 [dependencies] rust-package { git https://github.com/user/repo.git }但存在两类场景会让这种模式显得笨重包本身很小为它单独写一份清单属于杀鸡用牛刀代码位于另一个仓库而该仓库并未随源码附带pixi.toml例如上游项目只维护 CMake/pyproject.toml等并没有 pixi 清单。针对这两种情况内联包定义允许你直接在依赖声明上描述这个包构建定义写在依赖值的package子表中pixi 据此从给定源码构建而不再去仓库中寻找pixi.toml。启用前提pixi-build预览功能内联包定义目前属于pixi-build预览的一部分在正式稳定前接口可能变化。使用前必须在 workspace 中显式开启预览[workspace] channels [] platforms [linux-64] preview [pixi-build] [dependencies] rust-package { git https://github.com/user/repo.git, package.build.backend.name pixi-build-rust }仓库中的测试用例如 crates/pixi_manifest/src/toml/manifest.rs以及 tests/data/discovery/simple/pixi.toml 都体现了这一前提preview [pixi-build]是内联包定义能够被解析的必要条件。定义一个内联包基础语法将package表添加到源依赖值中即可。构建定义放在package.build下写法与独立pixi.toml中的[package.build]完全一致[dependencies] rust-package { git https://github.com/user/repo.git, package.build.backend.name pixi-build-rust }上面的写法使用了 TOML 点式键dotted key等价于展开成嵌套表[dependencies] rust-package { git https://github.com/user/repo.git, package { build { backend { name pixi-build-rust } } } }此时 pixi 会使用这份内联定义从给定 git 源码构建rust-package而不会在仓库里寻找pixi.toml。构建后端的name、version与channels均可指定例如仓库测试数据 tests/data/discovery/simple/pixi.toml 中的写法[package.build.backend] channels [https://prefix.dev/pixi-build-backends] name pixi_build_backend version *当前仓库内置了多个 pixi-build 后端可作为backend.name的参考取值pixi-build-rust、pixi-build-cmake、pixi-build-python、pixi-build-r、pixi-build-mojo、pixi-build-ros、pixi-build-rattler-build等对应仓库中 crates/pixi_build_rust、crates/pixi_build_cmake、crates/pixi_build_python 等 crate。源码位置来自依赖本身而非内联定义内联包定义与独立[package]段接受的字段并不完全相同最核心的差异有两点1.git、path、url留在依赖上源码位置通过依赖上常见的git、path、url字段指定不要在package.build.source中重复声明——在内联定义中设置package.build.source会被视为错误。解析器在 crates/pixi_manifest/src/utils/package_map.rs 中直接拒绝了这一写法报错信息为an inline package definition cannot set build.source; the source is taken from the dependency spec同时内联定义必须依附于真实存在的源码位置。解析器要求依赖值本身必须是git、path或url源见 crates/pixi_manifest/src/utils/package_map.rsan inline package definition requires a git, path or url source location2.path源相对于声明该依赖的清单解析path源是相对于声明该依赖的那个清单文件解析的而不是相对于某个工作目录[dependencies] my-lib { path vendor/my-lib, package.build.backend.name pixi-build-cmake }3. 不写package.name由依赖键推断内联定义中不允许设置package.name。pixi 会从依赖声明本身推断包名依赖键是my-lib包名就是my-lib。解析器在 crates/pixi_manifest/src/utils/package_map.rs 中显式拒绝显式namean inline package definition cannot set name; it is taken from the dependency key这一约束在底层实现中非常重要InlinePackageManifest::from_toml_package会把依赖键作为PackageDefaults.name传入并在最终清单中强制写入该名称见 crates/pixi_manifest/src/target.rs。原因正如源码注释所述pixi 依据依赖键解析源码构建出的包必须携带这个名字否则后端无法为 recipe 命名。内联定义中可以声明哪些内容除上述两点差异外内联的package表接受与独立[package]段相同的字段集合。除了build你还可以声明包自身的版本、依赖等[dependencies] my-lib { git https://github.com/user/repo.git, package { version 1.2.3, build { backend { name pixi-build-cmake } }, run-dependencies { fmt 10 } } }从 crates/pixi_manifest/src/toml/package.rs 中TomlPackage的解析结构看可用字段包括类别字段说明包元信息name内联定义中禁止由依赖键推断包元信息version包的版本号如1.2.3包元信息description、authors、license、license-file、readme、homepage、repository、documentation与独立[package]一致构建build构建定义含backend、channels、config、additional-dependencies等见下文依赖host-dependencies、build-dependencies、run-dependencies包的宿主/构建/运行依赖依赖extra-dependencies额外依赖组依赖run-constraints对下游的版本约束导出run-exports传递给下游消费者的运行期导出其他publish是否发布平台target平台相关的包配置其中build段在 crates/pixi_manifest/src/build_system.rs 中被建模为PackageBuild结构支持以下子字段backend构建后端name、version等additional_dependencies与后端一同安装的附加依赖channels获取构建工具所用的频道缺省时沿用所在 workspace 的频道source包源码位置——在内联定义中该字段必须为None源码来自外层依赖config传递给构建后端的附加配置如{ extra value }flagsV3 包变体标志target_config不同平台的后端配置build_string_prefix、build_number构建字符串前缀与构建号secrets以环境变量名形式暴露给构建脚本的机密值在构建时从宿主环境查询。内联定义允许出现的位置内联包定义被接受在一切源依赖可能出现的地方即[dependencies][feature.*]中的依赖变体[target.*]中的平台依赖变体例如平台限定写法[target.linux-64.dependencies] my-lib { path vendor/my-lib, package.build.backend.name pixi-build-rust }它们不允许出现在包的自身依赖表中[package.build-dependencies]、[package.host-dependencies]、[package.run-dependencies]。也就是说你可以在顶层 workspace 依赖上内联定义某个包但不能在被构建包自己的依赖表里继续嵌套内联定义——那一层依赖描述的是被构建包的依赖环境而不是源依赖的入口。这一规则在解析器中有清晰的实现痕迹内联package子表只会在允许的依赖表类型中被剥离收集InlinePackages::Allow而普通依赖表则以InlinePackages::Deny原样解析任何残留的package键都会交给 spec 解析器直接拒绝见 crates/pixi_manifest/src/utils/package_map.rs。底层实现剥离、收集与内容哈希理解内联定义在 pixi 中的完整生命周期有助于排查配置问题。解析阶段解析[dependencies]时deserialize_dependency_table会先调用peel_inline_package把每个依赖值中的package子表剥离出来剩余键继续解析为普通源 spec剥离出的TomlPackage按依赖名收集到DependencyTable::inline_packages见 crates/pixi_manifest/src/utils/package_map.rs。因此内联定义并不会吞掉源依赖——测试 test_inline_package_definition_in_dependencies 验证了 spec 仍保留在常规依赖表中同时内联清单被捕获到 target 的inline_packages。转换阶段from_toml_package把解析出的TomlPackage转换为完整的PackageManifestcrates/pixi_manifest/src/target.rs并强制写入从依赖键推断出的包名。指纹化与缓存每个内联定义都会生成一个InlineContentHash——对(依赖名, package 清单)的确定性哈希crates/pixi_manifest/src/target.rs。它被用作内容寻址构建缓存的键编辑内联定义会改变指纹并使相关缓存失效。仓库测试覆盖了它的关键性质确定性同一定义重复解析得到相同哈希test_inline_content_hash_is_deterministic格式无关点式键、字段顺序等格式差异不改变哈希因为哈希基于组装后的清单而非源码文本test_inline_content_hash_ignores_formatting感知构建配置修改build.config会改变哈希这正是需要对整个清单做哈希而非仅依赖的原因test_inline_content_hash_changes_with_build_config依赖名参与哈希两个内容相同但声明在不同依赖名下的内联表会得到不同指纹避免构建缓存串用test_inline_content_hash_folds_in_dependency_name。典型使用场景小结综合以上语法与约束内联包定义适合以下情况小包直接内联包很小、不值得单独维护清单直接在依赖上声明package.build.backend即可消费无 pixi 清单的上游仓库上游只有 CMake、Rust、Python 等构建体系通过pixi-build-*后端配合内联定义完成构建无需 fork 或额外添加清单文件vendor 本地源码path vendor/...配合内联定义将第三方源码纳入 workspace 依赖图。需要再次提醒的是该特性仍处于pixi-build预览阶段接口可能随版本演进而变化在生产化之前请始终在workspace.preview中声明pixi-build并关注后续稳定版本的迁移说明。赞分享开发工具CLI包管理器任务调度【免费下载链接】pixiPowerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem.项目地址https://gitcode.com/gh_mirrors/pi/pixi点击查看免费下载相关推荐factory_bot 内联关联Inline Association定义指南在常规属性中声明 association 及 attributes_for 行为解析factory_bot 内联关联Inline Association定义指南在常规属性中声明 association 及 attributes_for 行测试开发工具Swift Package Manager 构建插件Build Plugin启用指南从依赖声明到目标接入Swift Package Manager 构建插件Build Plugin启用指南从依赖声明到目标接入 Swift Package Manager以下开发工具构建工具Swift Package Manager 产品定义SE-0146全解析Package.swift 产物声明与细粒度依赖实战指南Swift Package Manager 产品定义SE 0146全解析Package.swift 产物声明与细粒度依赖实战指南 本文以 Swift 官方文档上一篇12行PythonH100上的TileLang GEMM打到cuBLAS同档下一篇手把手玩转ROFL播放器英雄联盟回放文件解析与实战复盘完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表