nix-community / bundix

Generates a Nix expression for your Bundler-managed application. [maintainer=@manveru]

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

attribute '"http_parser.rb"' missing

retpolanne opened this issue · comments

Hey folks!

I'm trying to code a nix-shell for my Jekyll project. However, I get this error:

error: attribute '"http_parser.rb"' missing

I see that http_parser.rb is my Gemfile:

gem "http_parser.rb", "~> 0.6.0", :platforms => [:jruby]

This is my shell.nix file

with import <nixpkgs> {};

let
  gems = pkgs.bundlerEnv {
    name = "jekyll-gems";
    inherit ruby;
    gemfile = ./Gemfile;
    lockfile = ./Gemfile.lock;
    gemset = ./gemset.nix;
  };
in stdenv.mkDerivation {
  name = "jekyll_env";
  buildInputs = [
    gems
    ruby.devEnv
    bundix
    jekyll
  ];
  shellHook = ''
    exec jekyll serve --watch
  '';
}

In my gemset.nix, http_parser.rb is the only dependency with quotes surrounding it, because of the .rb extension maybe

  google-protobuf = {
    groups = ["default" "jekyll_plugins"];
    platforms = [];
    source = {
      remotes = ["https://rubygems.org"];
      sha256 = "0ldmvy09adac1yqal61ip4iw53zl5jjbs808m6mfrpvgn0bw860r";
      type = "gem";
    };
    version = "3.23.3";
  };
  "http_parser.rb" = {
    groups = ["default" "jekyll_plugins"];
    platforms = [{
      engine = "jruby";
    }];
    source = {
      remotes = ["https://rubygems.org"];
      sha256 = "1gj4fmls0mf52dlr928gaq0c0cb0m3aqa9kaa6l0ikl2zbqk42as";
      type = "gem";
    };
    version = "0.8.0";
  };

If I remove this dependency, the shell starts fine, albeit with some errors from Jekyll.

Trace attached.
nix-shell-trace.txt

I wonder if this is an error caused by the .rb on the package name.

This is the whole error

       error: attribute '"http_parser.rb"' missing

       at /nix/store/afaxhwsgvx1q56f0wqds6a6b7dmdbvq2-nixpkgs/nixpkgs/lib/attrsets.nix:279:34:

          278|     # The set to get the named attributes from
          279|     attrs: genAttrs names (name: attrs.${name});
             |                                  ^
          280|

Any way to debug attrsets.nix with a debugger?


Debugging

$ nix repl --file shell.nix --debugger
nix-repl> buildInputs 
[ error: attribute '"http_parser.rb"' missing

       at /nix/store/afaxhwsgvx1q56f0wqds6a6b7dmdbvq2-nixpkgs/nixpkgs/lib/attrsets.nix:279:34:

          278|     # The set to get the named attributes from
          279|     attrs: genAttrs names (name: attrs.${name});
             |                                  ^
          280|


Starting REPL to allow you to inspect the current state of the evaluator.

Welcome to Nix 2.16.1. Type :? for help.

nix-repl> attrs
«derivation { addressable = { ... }; colorator = { ... }; concurrent-ruby = { ... }; em-websocket = { ... }; eventmachine = { ... }; ffi = { ... }; forwardable-extended = { ... }; google-protobuf = { ... }; i18n = { ... }; jekyll = { ... }; jekyll-feed = { ... }; jekyll-sass-converter = { ... }; jekyll-seo-tag = { ... }; jekyll-watch = { ... }; kramdown = { ... }; kramdown-parser-gfm = { ... }; liquid = { ... }; listen = { ... }; mercenary = { ... }; minima = { ... }; pathutil = { ... }; public_suffix = { ... }; rb-fsevent = { ... }; rb-inotify = { ... }; rexml = { ... }; rouge = { ... }; safe_yaml = { ... }; sass-embedded = { ... }; terminal-table = { ... }; unicode-display_width = { ... }; webrick = { ... }; }

nix-repl> 

I don't see http_parser.rb here. However, removing the .rb and the quotes makes nix-shell work!

  http_parser = {
    groups = ["default" "jekyll_plugins"];
    platforms = [];
    source = {
      remotes = ["https://rubygems.org"];
      sha256 = "1gj4fmls0mf52dlr928gaq0c0cb0m3aqa9kaa6l0ikl2zbqk42as";
      type = "gem";
    };
    version = "0.8.0";
  };

Obviously it just skips the validation, to make the dependency work properly I had to fork it and rename it.

Some issue here. Have you found a solution?

Hey @felipelalli check my Gemfile: https://github.com/retpolanne/retpolanne.com/blob/f87303ce39c8c83b8456527911606e9890a75ce2/Gemfile#L28

I forked it with a different name so I can workaround this issue.

PS: make a fork in your own github, for security reasons ;)

@retpolanne Hey I tried to look into this issue but I have not been able to reproduce it. Do you have a minimal reproducible recipe?

I've tried with the following

# Gemfile
source "https://rubygems.org"

# Generate the lock and gemset file by
# rm Gemfile.lock gemset.nix
# nix-shell -p ruby_3_2 bundix
# bundle lock
# bundix
gem "http_parser.rb"
# default.nix
{ system ? builtins.currentSystem, nixpkgs ? fetchTarball {
  url = "https://github.com/NixOS/nixpkgs/archive/refs/tags/23.05.tar.gz";
  sha256 = "10wn0l08j9lgqcw8177nh2ljrnxdrpri7bp0g7nvrsn9rkawvlbf";
}, pkgs ? import nixpkgs {
  overlays = [ ];
  config = { };
  inherit system;
} }:
let
  ruby = pkgs.ruby_3_2;
  gems = pkgs.bundlerEnv {
    inherit ruby;
    name = "jekyll-gems";
    gemfile = ./Gemfile;
    lockfile = ./Gemfile.lock;
    gemset = ./gemset.nix;
  };
in
{
  shell = pkgs.stdenv.mkDerivation {
    name = "jekyll_env";
    src = ./.;
    buildInputs = [
      gems
      gems.wrappedRuby
    ];
  };
}

and the following works

cd ~/src/bundix-http-parser.rb
$ nix-shell -A shell
these 3 derivations will be built:
  /nix/store/4vlyrj5p9ka7nm1bdvbi882bf5p4iqj0-gemfile-and-lockfile.drv
  /nix/store/bgbipxqjywsk8xviar3wr2wzi5350wg2-jekyll-gems.drv
  /nix/store/f56rgy57dn50jkhp8hmxk7fv6s6p72gl-wrapped-ruby-jekyll-gems.drv
building '/nix/store/4vlyrj5p9ka7nm1bdvbi882bf5p4iqj0-gemfile-and-lockfile.drv'...
building '/nix/store/bgbipxqjywsk8xviar3wr2wzi5350wg2-jekyll-gems.drv'...
created 6 symlinks in user environment
building '/nix/store/f56rgy57dn50jkhp8hmxk7fv6s6p72gl-wrapped-ruby-jekyll-gems.drv'...
patching sources
configuring
no configure script, doing nothing
building
running tests
post-installation fixup
shrinking RPATHs of ELF executables and libraries in /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/ruby
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/racc
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/rdbg
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/erb
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/typeprof
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/ri
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/rdoc
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/rbs
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/rake
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/bundle
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/bundler
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/gem
shrinking /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin/irb
checking for references to /build/ in /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems...
patching script interpreter paths in /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems
stripping (with command strip and flags -S -p) in  /nix/store/s5zcf1vi685dhfpb34vk4d9iz1pyxpyg-wrapped-ruby-jekyll-gems/bin

[nix-shell:~/src/bundix-http-parser.rb]$ irb
>> require 'http/parser'
=> true

Are you using jruby as the ruby?

@PuercoPop can you share the generated gemset.nix? That looks like a minimal example to me.

Sure this is the setup I've used to trying to reproduce ithe issue https://github.com/PuercoPop/bundix-http-parser.rb

Note: One thing I haven't done when generating the lock file but I normally do is to set BUNDLE_FORCE_RUBY_PLATFORM: "true so that one can use the same Gemfile.lock across different different platforms/systems

@PuercoPop yea, from what I see your setup should trigger this bug. Weird why it didn't trigger it. Maybe it's fixed?

@retpolanne I think the difference that triggers the issue was due to including the :platforms => [:jruby] in the Gemfile. That results in bundix adding an engine = "jruby" entry to "http-parser.rb".platform entry in the reported Gemset.

 platforms = [{
      engine = "jruby";
    }];
``

That is why I asked whether you were trying to build jekyll on jruby or not.

I'm not sure what exactly is the reason, but it seems that adding the platform entry results in cruby trying to load jruby specific code