如何为Ruby Bundler创建Nix Overlay以适配新版本需求?
为Ruby Bundler创建Nix Overlay并在nix-shell中使用指定版本
我来帮你搞定这个问题,让你的本地派生包foo能顺利依赖指定版本的Bundler(1.16.1),不用受限于nixpkgs unstable分支的旧版本。咱们一步步来:
1. 编写custom_packages.nix的Overlay配置
Overlay是Nix中替换或扩展现有包的核心方式,你需要在这个文件里定义如何覆盖Bundler,或者新增版本供foo使用。示例内容如下:
self: super: { # 方式1:直接替换全局bundler版本(适合所有包都需要用这个版本的场景) bundler = super.callPackage ./pkgs/bundler/1_16_1 { }; # 方式2:保留原版本,新增带版本后缀的包(更灵活,避免影响其他依赖) bundler_1_16_1 = super.callPackage ./pkgs/bundler/1_16_1 { }; # 覆盖本地包foo,让它依赖咱们自定义的bundler版本 foo = super.callPackage ./pkgs/foo { bundler = self.bundler_1_16_1; # 若用方式1则写self.bundler即可 }; }
2. 完善pkgs/bundler/1_16_1/default.nix
参考上游nixpkgs的Bundler模板,修改版本号和对应哈希值。示例内容:
{ lib, bundlerEnv, ruby }: bundlerEnv { name = "bundler-1.16.1"; inherit ruby; gemdir = ./.; # 需自行生成对应版本的Gemfile.lock和哈希: # 先在该目录创建Gemfile(内容为`source 'https://rubygems.org'; gem 'bundler', '1.16.1'`) # 运行`bundler lock`生成Gemfile.lock,再用`nix-prefetch-gem bundler 1.16.1`获取SHA256哈希填入 }
3. 配置shell.nix加载Overlay
要让nix-shell识别你的自定义包,需要在shell.nix中引入nixpkgs并应用Overlay:
{ pkgs ? import <nixpkgs> { overlays = [ (import ./custom_packages.nix) ]; } }: pkgs.mkShell { buildInputs = [ pkgs.foo ]; # 可选:如果需要直接在shell中调用bundler命令 extraBuildInputs = [ pkgs.bundler_1_16_1 ]; }
4. 检查pkgs/foo/default.nix的依赖
确保foo的配置文件中明确依赖指定的Bundler版本,比如:
{ stdenv, bundler, ... }: stdenv.mkDerivation { name = "foo"; src = ./.; buildInputs = [ bundler ]; # 其他构建步骤... }
5. 测试运行
在项目根目录执行以下命令进入nix-shell:
nix-shell
进入shell后验证Bundler版本是否正确:
bundler --version
如果显示Bundler version 1.16.1,且foo包能正常构建运行,就说明配置成功了。
内容的提问来源于stack exchange,提问作者b73
相关产品推荐
相关产品推荐

