nix-community / bundix

Generates a Nix expression for your Bundler-managed application. [maintainer=@manveru]
163 stars 55 forks source link

Bundix doesn't work with a newly created gem #41

Closed smaximov closed 5 years ago

smaximov commented 5 years ago

To reproduce the issue, consider this minimal gem specification.

bundix-issue.gemspec:

lib = File.expand_path("../lib", __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)

Gem::Specification.new do |spec|
  spec.name          = "bundix-issue"
  spec.version       = '0.1.0'
  spec.authors       = ["Sergei Maximov"]
  spec.email         = ["s.b.maximov@gmail.com"]

  spec.summary       = 'Bundix issue'

  spec.files         = []
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
end

shell.nix:

{ pkgs ? import <nixpkgs> {}
}:
let
  ruby = pkgs.ruby_2_5;
in pkgs.mkShell {
  buildInputs = with pkgs; [ruby bundix];
}

When trying to build a gemset.nix file, I get the following error:

$ bundix --ruby=ruby_2_5
0jcabbgnjc788chx31sihc5pgbqnlc1c75wakmqlbjdm8jns2m9b => rake-10.5.0.gem
Traceback (most recent call last):
    30: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/bin/.bundix-wrapped:18:in `<main>'
    29: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/bin/.bundix-wrapped:18:in `load'
    28: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/bin/bundix:5:in `<top (required)>'
    27: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/commandline.rb:22:in `run'
    26: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/commandline.rb:36:in `run'
    25: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/commandline.rb:158:in `save_gemset'
    24: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/commandline.rb:152:in `object2nix'
    23: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:20:in `serialize'
    22: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:83:in `serialize'
    21: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `result'
    20: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `eval'
    19: from (erb):2:in `serialize'
    18: from (erb):2:in `each'
    17: from (erb):2:in `block in serialize'
    16: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:69:in `sub'
    15: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:83:in `serialize'
    14: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `result'
    13: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `eval'
    12: from (erb):2:in `serialize'
    11: from (erb):2:in `each'
    10: from (erb):2:in `block in serialize'
     9: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:69:in `sub'
     8: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:85:in `serialize'
     7: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `result'
     6: from /nix/store/r7dapysmfxkw3lw7cjz7zzxzv7c9hy06-ruby-2.5.3/lib/ruby/2.5.0/erb.rb:876:in `eval'
     5: from (erb):1:in `serialize'
     4: from (erb):1:in `each_with_index'
     3: from (erb):1:in `each'
     2: from (erb):1:in `block in serialize'
     1: from /nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:69:in `sub'
/nix/store/8z2ykap62kdcf19m2qsi5zapw01rf0gi-bundix-2.4.1/lib/ruby/gems/2.5.0/gems/bundix-2.4.1/lib/bundix/nixer.rb:100:in `serialize': Cannot convert to nix: nil (RuntimeError)

Environment

I'm on macOS Mojave v10.14.2, ruby 2.5.3p105, bundix 2.4.1.

manveru commented 5 years ago

What's in your Gemfile?

smaximov commented 5 years ago

It's just the default Gemfile created by bundle gem $GEMNAME:

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# Specify your gem's dependencies in bundix-issue.gemspec
gemspec
smaximov commented 5 years ago

@manveru I've done some debugging and it seems like the error is caused by a missing PLATFORM_MAPPING for :truffleruby.

When determining platforms for "bundix-issue", dep_cache.fetch(spec.name).platforms returns :truffleruby among others. Because it does not have a corresponding mapping in PLATFORM_MAPPING, the map's block returns nil.

The resulting gemset (before serialization) looks like this (note the trailing nil in "bundix-issue" => :platforms):

{"rake"=>{:version=>"10.5.0", :source=>{:type=>"gem", :remotes=>["https://rubygems.org"], :sha256=>"0jcabbgnjc788chx31sihc5pgbqnlc1c75wakmqlbjdm8jns2m9b"}, :platforms=>[], :groups=>[:development]},
 "bundix-issue"=>
  {:version=>"0.1.0",
   :source=>{:type=>"path", :path=>#<Pathname:.>},
   :platforms=>
    [{:engine=>"ruby"},
     {:engine=>"rbx"},
     # ...snip...
     {:engine=>"ruby", :version=>"2.5"},
     {:engine=>"maglev", :version=>"2.5"},
     {:engine=>"rbx"},
     nil], # <= this!!!
   :groups=>[:default]}}

Because of nil in :platforms, serialization breaks here.

alyssais commented 5 years ago

Perhaps we could reuse Bundler's platform map…

robx commented 5 years ago

I'm having the same issue, running bundix against https://github.com/twitter/twurl