Code Monkey home page Code Monkey logo

gel's Introduction

Gel

A modern gem manager.

Gel is a lightweight alternative to Bundler.

Through a combination of algorithm choices and skipping compatibility with some legacy features that date back to the earliest days of RubyGems, Gel is able to outperform both Bundler and RubyGems in many common use cases.

In making this trade, Gel chooses not to support some less frequently used, but independently valuable, Bundler features:

Gel Bundler & Rubygems
install
update
lock
exec
gem authoring
vendoring 🆗
anything else

In most cases, Gel will be a drop-in replacement, and you can still use RubyGems directly if you need to gem push, for example.

Can I Use Gel Today?

I (@matthewd) have been using Gel exclusively on my local development machines since January 2019. While I have occasionally encountered issues when installing some new gem, they have been rare and minor, requiring only a small additional API or similar -- and as those outliers have been addressed, they become increasingly infrequent.

In particular (and as is consistent with the type of work it does), Gel will either work or it will fail -- perhaps on encountering an unusual construct in your Gemfile, or perhaps while attempting to install a gem that does something weird. The "latest" it is likely to fail is if, at runtime, your code (or a gem you've loaded) assumes the presence of a specific RubyGems/Bundler API that Gel does not emulate. It's extremely rare to encounter more subtle issues that don't manifest as immediate failure.

You can use Gel in your local environment with no effect upon your production setup, or even your coworkers' -- Gel uses the same Gemfile and Gemfile.lock files as Bundler. It also maintains completely independent copies of installed gems, so it's totally safe to co-exist with Bundler on your machine. (Which one is active is determined by the environment variables within your shell terminal.)

Why Should I Use Gel?

Gel was written with the goal of improving the performance of common Bundler tasks.

By focusing on those common requirements, and leaving more obscure needs to be filled by Bundler, Gel is able to outperform Bundler in the operations you use most.

Gel also uses a new version solving algorithm called Pub Grub to resolve dependencies between gems, via the pub_grub gem (https://github.com/jhawthorn/pub_grub).

Some real world examples of the types of performance improvements Gel provides over Bundler are as follows:

  • % gel exec rake -version: 55% faster than bundle
  • % gel exec rails --version: 60% faster than bundle
  • % gel exec rails runner nil: 45% faster than bundle

Comparing using a complex, mature Rails application:

  • % gel install: 55% faster than bundle
  • % gel lock: 78% faster than bundle on first run
  • % gel lock: 95% faster than bundle on later runs (cache exists)

Comparing using a simple Gemfile with a complex gem:

source "https://rubygems.org"

gem "tty"
  • % gel install: 70% faster than bundle
  • % gel lock: 34% faster than bundle

Comparing using an example Gemfile with gems that showcase a difficult version resolving:

source "https://rubygems.org"

gem "activerecord"
gem "quiet_assets"
  • % gel lock: 96% faster than bundle

This example showcases the speed improvements provided by the new PubGrub Version Solving algorithm.

Note that all of the performance numbers were gathered using just a regular laptop used for common day-to-day development. These numbers were not measured in perfect isolation and your experience may vary.

Installation

If you're on a Mac, we recommend that you install via Homebrew:

$ brew install gel

Otherwise, you can install Gel as a gem:

$ gem install gel

Then, either activate Gel in your current shell:

$ eval "$(gel shell-setup)"

Or add it to your .bashrc or .zshrc to enable it everywhere:

$ echo 'eval "$(gel shell-setup)"' >> ~/.bashrc

Usage

Use gel install, gel lock, gel update, and gel exec as you would the equivalent bundle subcommands.

While it will work, in general you should not actually need to use gel exec directly -- installed gems' executables will automatically respect the locally locked versions where appropriate.

Where you would previously have run bundle exec rubocop or bundle exec rake inside an application directory, you can run rubocop or rake and expect the same results, even if you have other versions of those gems installed.

ENVIRONMENT VARIABLES

Development

After checking out the repo, run bin/setup to install dependencies. Then, run bin/rake test to run the tests.

To use your development instance as your primary Gel, add its exe/ to your $PATH before running shell-setup, ensuring it comes before any RubyGems bin directory that might override it.

For example:

PATH="$HOME/projects/gel/exe:$PATH"
eval "$(gel shell-setup)"

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/gel-rb/gel. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Gel project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

gel's People

Contributors

andreyors avatar bquorning avatar davy avatar dependabot[bot] avatar frostmark avatar gsamokovarov avatar hahmed avatar hparker avatar jhawthorn avatar juanitofatas avatar kaspth avatar keithpitt avatar matthewd avatar ozmullins avatar paracycle avatar searls avatar sj26 avatar tenderlove avatar venarius avatar yb66 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gel's Issues

UI

I don't mind working on the UI to help get something up for gel, I ran some benchmarks and wanted to clarify the direction before opening up a PR.

require 'benchmark/ips'
require "thor"

shell = Thor::Base.shell.new

Benchmark.ips do |x|
  x.config(:time => 1, :warmup => 2)

  x.report("puts") do |times|
    puts 'Gel...'
  end

  x.report("stderr") do |times|
    STDERR.puts 'Gel***'
  end

  x.report('thor') do |times|
    shell.say("Gel===")
  end

  x.report('echo') do |times|
    %x( echo 'Gel~~~' )
  end

  x.report('subshell') do |times|
    system( "echo 'Gel>>>'" )
  end

  x.report('backtrix') do |times|
    `echo 'Gel%%%'`
  end

  # Exec exits current process, not considering
  # x.report('exec') do |times|
  #   exec( "echo 'Gel%%%'" )
  # end

  # Add colour: would it work in windows? Read somewhere windows needs something else to make this work,
  # perhaps windows 10 just works, who cares?
  color_code = 31 # red
  message = "Gel+++".freeze
  x.report('stderr_red') do |times|
    STDERR.puts("\e[#{color_code}m#{message}\e[0m")
  end

  x.report('thor_red') do |times|
    shell.say("Gel&&&", :red)
  end

  x.compare!
end

The results I got back;

      1.159B (±19.2%) i/s -      1.021B in   0.967686s

Comparison:
              stderr: 6807884957.6 i/s
                puts: 6669602986.8 i/s - same-ish: difference falls within error
          stderr_red: 5419178831.1 i/s - same-ish: difference falls within error
                thor: 3100900669.8 i/s - 2.20x  slower
            thor_red: 1158742043.2 i/s - 5.88x  slower
            subshell:     9302.5 i/s - 731832.21x  slower
                echo:     9074.3 i/s - 750238.34x  slower
            backtrix:     9067.0 i/s - 750839.19x  slower

Thor is used by bundler, even rails, it's slow - you mentioned making gel fast as possibly, are you happy to use STDERR?

Had a look at the UI for bundler, how do you want the api to look for Gel::UI?

UI.info(message)
UI.warn(message)

bundle exec fails if gem in git repo installed via gel

Hi again,

For context, I'm trying to install and serve a Jekyll site in a Docker container. The Gemfile has this:

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
gem "hitchens-theme", github: "yb66/hitchens.git"

The install via gel install appears to work:

<snip>
Installing eventmachine (1.2.7)
Using hitchens-theme (git)
Installing sassc (2.2.1)
Installed 28 gems

But it fails when Bundler gets involved via bundle exec

bundler: failed to load command: jekyll (/usr/local/bundle/bin/jekyll)
Bundler::GitError: The git source https://github.com/yb66/hitchens.git is not yet checked out. Please run `bundle install` before trying to start your application

If I jump into the container and install via Bundler and then run bundle exec… Jekyll will start.

The key difference I've found thus far is in where Bundle and Gel put checkouts:

/site # find $GEM_HOME -name 'hitchens*'
/usr/local/bundle/cache/bundler/git/hitchens-03bc3dae44cad582230abce3c4a35d47a4d95749
/usr/local/bundle/bundler/gems/hitchens-d80fd495f6bd
/usr/local/bundle/bundler/gems/hitchens-d80fd495f6bd/hitchens-theme.gemspec
/site # find / -name 'hitchens*'
/root/.local/gel/git/hitchens-d80fd495f6bda
/root/.local/gel/git/hitchens-d80fd495f6bda/hitchens-theme.gemspec
/root/.cache/gel/git/hitchens-029cb425975f5

I'm trying to understand the GitDepot class and what's happening around it and I'll start trying a few things but any thoughts or pointers are welcome.

Regards,
iain

Gem constant is not loaded yet

How to reproduce

(at your cloned gel repository)

$ git co 2a17bdcc8095cf3df71f9df870d5f8fda7434a9b
$ ./exe/gel
Gel doesn't have a default command; please run `gel install`

$ git co cef7778c5e8fceb64ae549f2b4311d9eddd79fb4
$ ./exe/gel

...
uninitialized constant Gem (NameError)

It is breaking since cef7778. But the changes 2a17bdc...cef7778 look fine.

gem version: 3.0.1 (tried different gem versions, not relevant)
ruby: 2.6.3p62 (tried different rubies, not relevant)
Full Backtrace
Traceback (most recent call last):
	20: from ./exe/gel:12:in `<main>'
	19: from ./exe/gel:12:in `require_relative'
	18: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/command.rb:3:in `<top (required)>'
	17: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/command.rb:3:in `require_relative'
	16: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/compatibility.rb:4:in `<top (required)>'
	15: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/compatibility.rb:4:in `require_relative'
	14: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/compatibility/rubygems.rb:9:in `<top (required)>'
	13: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/compatibility/rubygems.rb:9:in `require_relative'
	12: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/runtime.rb:3:in `<top (required)>'
	11: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/runtime.rb:3:in `require_relative'
	10: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel.rb:22:in `<top (required)>'
	 9: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel.rb:22:in `require_relative'
	 8: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/lock_loader.rb:3:in `<top (required)>'
	 7: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/lock_loader.rb:3:in `require_relative'
	 6: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:4:in `<top (required)>'
	 5: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:4:in `require_relative'
	 4: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/catalog.rb:9:in `<top (required)>'
	 3: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/catalog.rb:9:in `require_relative'
	 2: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/support/gem_platform.rb:9:in `<top (required)>'
	 1: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/support/gem_platform.rb:9:in `require'
/Users/juanitofatas/.rubies/ruby-2.6.1/lib/ruby/2.6.0/rubygems/deprecate.rb:24:in `<top (required)>': uninitialized constant Gem (NameError)

I traced down the error throws at here:

gel/lib/gel.rb

Line 22 in 6c964bd

require_relative "gel/lock_loader"

gel/lock_loader.rb => gel/resolved_gem_set.rb => gel/catalog.rb => support/gem_platform.rb => require "rubygems/deprecate" 💥

How do we make Gem available at Gel codebase?

Discoverability

I just spent ages (well, maybe 5 minutes) searching for this repo despite having starred it years ago. There are three issues:

  1. It doesn't use GitHub topics, so it's hard to find by searching for bundle, bundler etc. (and impossible to find by searching for gem).
  2. It's hard to find in starred repos if you don't remember the exact description (the filter only matches the repo's name, GitHub description, and GitHub topics).
  3. I remembered that it was based on PubGrub, so figured it would be listed in that gem's reverse dependencies, but for some reason it's a development dependency which appears to be installed dynamically.

Suggestions:

  1. and 2. can be improved by adding some topics, e.g. bundle, bundler, gem, gems, install, installer, manager, pubgrub, rubygems.
  2. Dunno. Is there a reason why it isn't just included as a runtime dependency?

NoMethodError: undefined method `name' for nil:NilClass

I've been getting some odd errors when starting Puma using gel:

Traceback (most recent call last):
	20: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/bin/puma-wild:31:in `<main>'
	19: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cli.rb:78:in `run'
	18: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/launcher.rb:184:in `run'
	17: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:466:in `run'
	16: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:133:in `spawn_workers'
	15: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:133:in `times'
	14: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:137:in `block in spawn_workers'
	13: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:137:in `fork'
	12: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:137:in `block (2 levels) in spawn_workers'
	11: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/cluster.rb:273:in `worker'
	10: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/runner.rb:162:in `start_server'
	 9: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/runner.rb:155:in `app'
	 8: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/configuration.rb:243:in `app'
	 7: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/configuration.rb:318:in `load_rackup'
	 6: from /Users/sj26/.local/gel/2.6.0/gems/puma-3.12.0/lib/puma/configuration.rb:305:in `rack_builder'
	 5: from /usr/local/Cellar/gel/0.3.0/lib/gel/compatibility/rubygems.rb:197:in `require'
	 4: from /usr/local/Cellar/gel/0.3.0/lib/gel/environment.rb:581:in `resolve_gem_path'
	 3: from /usr/local/Cellar/gel/0.3.0/lib/gel/locked_store.rb:87:in `gems_for_lib'
	 2: from /usr/local/Cellar/gel/0.3.0/lib/gel/locked_store.rb:87:in `each'
	 1: from /usr/local/Cellar/gel/0.3.0/lib/gel/locked_store.rb:87:in `block in gems_for_lib'
/usr/local/Cellar/gel/0.3.0/lib/gel/environment.rb:583:in `block in resolve_gem_path': undefined method `name' for nil:NilClass (NoMethodError)

It's coming from here:

https://github.com/gel-rb/gel/blob/v0.3.0/lib/gel/environment.rb#L583

I added a pp(path: path, subdir: subdir) if gem.nil? in there and got:

{:path=>"active_record/railtie", :subdir=>nil}
{:path=>"i18n", :subdir=>nil}

Then I ran it again and got:

{:path=>"active_support", :subdir=>nil}
{:path=>"i18n", :subdir=>nil}

It seems to change subtly on each invocation. Race condition?

Non-default gem sources fight with bundler over "!"

We have a gemfile with a few custom source "..." { ... } blocks. Gems inside these blocks are listed in the Gemfile.lock under DEPENDENCIES with a "!" suffix by bundler, but the "!" is stripped by Gel, leading to diffs like:

diff --git a/Gemfile.lock b/Gemfile.lock
index 3cf7a354ed..d3b204c269 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -647,7 +647,7 @@ DEPENDENCIES
   gitable
   graphql
   graphql-batch
-  graphql-pro
+  graphql-pro!
   hiredis
   html-pipeline
   http
@@ -720,8 +720,8 @@ DEPENDENCIES
   selenium-webdriver
   sidekiq
   sidekiq-cloudwatchmetrics
-  sidekiq-ent
-  sidekiq-pro
+  sidekiq-ent!
+  sidekiq-pro!
   simple_oauth
   simplecov
   simplecov-buildkite

Support source authentication external to the Gemfile

Today gel only support authentication of private gem sources when the user and password are n the URL. It would be good if we could change and store the authentication credentials outside of the Gemfile making possible for having per-user credentials.

NoMethodError: undefined method `bundle_path' for Bundler:Module

bootsnap gem (this is a rails 5 app), calls Bundler.bundle_path.cleanpath) which fails:

 > be rake -T
Unknown lockfile section "RUBY VERSION"
Unknown lockfile section "RUBY VERSION"
rake aborted!
NoMethodError: undefined method `bundle_path' for Bundler:Module
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/path_scanner.rb:14:in `<module:PathScanner>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/path_scanner.rb:7:in `<module:LoadPathCache>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/path_scanner.rb:6:in `<module:Bootsnap>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/path_scanner.rb:5:in `<top (required)>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache.rb:71:in `require_relative'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache.rb:71:in `<top (required)>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap.rb:3:in `require_relative'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap.rb:3:in `<top (required)>'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/setup.rb:1:in `require_relative'
/Users/viktor/.local/gel/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/setup.rb:1:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/Users/viktor/Developer/pop/config/boot.rb:6:in `<top (required)>'
/Users/viktor/Developer/pop/config/application.rb:3:in `require_relative'
/Users/viktor/Developer/pop/config/application.rb:3:in `<top (required)>'
/Users/viktor/Developer/pop/Rakefile:6:in `require_relative'
/Users/viktor/Developer/pop/Rakefile:6:in `<top (required)>'
/Users/viktor/.local/gel/ruby/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/exec.rb:34:in `load'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/exec.rb:34:in `run'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/stub.rb:8:in `run'
/usr/local/Cellar/gel/0.2.0/lib/gel/command.rb:13:in `run'
/usr/local/bin/gel:13:in `<main>'
(See full trace by running task with --trace)

Ruby 2.6.3
Bundler 1.17.3

~/.zshrc:

eval "$(gel shell-setup)"

When I remove this line from my ~/.zshrc, bundle exec works as expected.

Conditionals in Gemfile and C extensions

I tried the gel gem today it's blazing fast I love it. But the project I ran it on today, failed. After working with it and jumping between a few of my projects to test out a few theories before raising an issue.

One of the issues I came across is if you have an if_install conditional statement in your gemfile it'll catch with an exception. I have this in a few of my gemfiles. That way I can use mini_racer when developing locally, but if I'm deploying it on an Alpine docker image it won't install this gem (this is because Alpine uses musl instead of glibc).
ERROR: Failed to evaluate "/Users/FakeUser/Desktop/ProjectName/Gemfile": undefined method 'install_if' for #<Gel::GemfileParser::ParseContext:0x0000000107cc84b0>

Below is the snip form my gemfile

install_if -> { !(RUBY_PLATFORM =~ /linux-musl/) } do
  gem 'mini_racer', platforms: :ruby # C based alternative instead of rubyracer
end

It also seems to fail on installing several gems that has a C extension associated with the gem.
For example two gems that failed to install were sassc-rails and pg. Strangely enough it does install gems such as fast_blank, I'm thinking maybe this is because the C file is included in the gems ext directory, rather than an external library that the gem needs to compile the extension for.

```shell
Errors encountered with 1 gems:

pg
  extconf exited with 1



===== Gel Internal Error =====

Traceback (most recent call last):
  14: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
  13: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/work_pool.rb:46:in `catch'
  12: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
  11: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/work_pool.rb:47:in `loop'
  10: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/work_pool.rb:62:in `block (4 levels) in start'
   9: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/installer.rb:118:in `block (2 levels) in work_download'
   8: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/installer.rb:134:in `work_compile'
   7: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:206:in `compile'
   6: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:206:in `each'
   5: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:209:in `block in compile'
   4: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:154:in `compile_extconf'
   3: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:88:in `with_build_environment'
   2: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:88:in `open'
   1: from /Users/FakeUser/.rvm/gems/ruby-2.6.1@tasky/gems/gel-0.3.0/lib/gel/package/installer.rb:89:in `block in with_build_environment'
/Users/FakeUser/.rvm/gems/ruby-2.6.1@FakeApp/gems/gel-0.3.0/lib/gel/package/installer.rb:163:in `block in compile_extconf': extconf exited with 1 (RuntimeError)

Gel calling private method of PubGrub

$ gel update mini_magick --strict
Fetching sources....
Resolving dependencies...

===== Gel Internal Error =====

Traceback (most recent call last):
	10: from .../gel/exe/gel:13:in `<main>'
	 9: from .../gel/lib/gel/command.rb:13:in `run'
	 8: from .../gel/lib/gel/command/update.rb:8:in `run'
	 7: from .../gel/lib/gel/command/lock.rb:32:in `run'
	 6: from .../gel/lib/gel/environment.rb:228:in `lock'
	 5: from ~/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:40:in `work'
	 4: from ~/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:134:in `choose_package_version'
	 3: from ~/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/basic_package_source.rb:134:in `incompatibilities_for'
	 2: from ~/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/basic_package_source.rb:113:in `block (2 levels) in initialize'
	 1: from .../gel/lib/gel/pub_grub/source.rb:68:in `dependencies_for'
.../gel/lib/gel/pub_grub/preference_strategy.rb:38:in `constraints': private method `ranges' called for #<Gel::PubGrub::PreferenceStrategy:0x00007fb9c6a71408> (NoMethodError)

Gel to support GitHub flag

I really like the feature of bundler to easily clone repos from GitHub by specifying the repository path using the github flag:

gem 'nokogiri', :github => 'tenderlove/nokogiri'

Would be awesome if Gel also supports that feature. Since I already said that I want to get more involved into this project, I can also try adding support for that flag 👍

stuck on downloading rails

I'm stuck with that:

[Downloading: activesupport activemodel activestorage activejob railties activerecord +88]

maybe it's using the bundler compatibility layer because that's an issue I have with bundler too (but not when manually using git)

this is what is in my Gemfile:

gem 'rails', github: 'rails/rails'

Platform filtering: harder than it sounds?

After trying to work through a couple of strategies to get platform handling right, I'm starting to think that pubgrub needs to know about it internally. 😕

Filtering gems that are listed in the Gemfile is easy... but things seem to get more complicated when we start dealing with dependencies.

To take the rails/rails Gemfile as an example:

  • activerecord-jdbc-adapter 52.1 should be acceptable because it's only depended on by java-only packages, even though it doesn't have a non-java release of that version available
  • eventmachine is a dependency of blade, which is platform-filtered, so even though it has java & windows versions available, we don't want them [or any dependencies they might've had]
  • nokogiri is platform-filtered in the gemfile, but is also a dependency of many non-filtered gems, so we do need to choose a version that has full platform support

There generally aren't a lot of examples of situations where a gem has an incomplete set available, but we can look at nokogiri 1.4.4.{1,2} as such an instance: those versions are valid candidates when locking only for windows or java, respectively, but not acceptable otherwise.

`gemspec` does not acommodate arguments

gemspec development_group: :ci

ERROR: Failed to evaluate "/Users/sam/dev/core/Gemfile": wrong number of arguments (given 1, expected 0)
/Users/sam/.gem/ruby/2.5.1/gems/gel-0.2.0/lib/gel/gemfile_parser.rb:58:in `gemspec'

Unknown lockfile section "RUBY VERSION"

I ran gel install on a project that had previously been using Bundler. It installed 78 gems and exited cleanly .

Next, I ran gel lock and it wrote these changes to my Gemfile.lock:

diff --git a/Gemfile.lock b/Gemfile.lock
index 729d812..e8de581 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -202,7 +202,4 @@ DEPENDENCIES
   webpacker
 
 RUBY VERSION
-   ruby 2.6.0p0
-
-BUNDLED WITH
-   1.17.3
+   ruby 2.6.1p33

But it also output this warning:

Unknown lockfile section "RUBY VERSION"

The warning now prints whenever I run gel lock or gel install.

This seemed odd to me since gel also printed the Ruby version to the lockfile.

ruby method doesn't accept multiple versions

Given the following Gemfile, bundle install works, but gel install fails with this error:

ERROR: Failed to evaluate "/Users/stevendaniels/gel_test/Gemfile": wrong number of arguments (given 2, expected 1)
/Users/stevendaniels/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/gel-0.3.0/lib/gel/gemfile_parser.rb:41:in `ruby'
/Users/stevendaniels/gel_test/Gemfile:3:in `parse'
# Gemfile
source "https://rubygems.org"

ruby ">= 2.5.0", "< 2.7.0"
gem "gel"

Bundler handles ruby versions here and here.

def ruby(version, engine: nil, engine_version: nil)

NoMethodError: undefined method `satisfied_by?' for ["~> 0.10"]:Array

> bundle exec rake style
Unknown lockfile section "RUBY VERSION"
Unknown lockfile section "RUBY VERSION"
rake aborted!
NoMethodError: undefined method `satisfied_by?' for ["~> 0.10"]:Array
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:72:in `block in supported?'

Ruby 2.6.3
Bundler 1.17.3
Pry 0.12.2

~/.zshrc:

eval "$(gel shell-setup)"

When I remove this line from my ~/.zshrc, bundle exec works as expected.

Stack trace:

> bundle exec rake style
Unknown lockfile section "RUBY VERSION"
Unknown lockfile section "RUBY VERSION"
rake aborted!
NoMethodError: undefined method `satisfied_by?' for ["~> 0.10"]:Array
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:72:in `block in supported?'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:70:in `each'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:70:in `supported?'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:90:in `block in locate_plugins'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:40:in `each'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:40:in `each'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/plugins.rb:85:in `locate_plugins'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/pry_class.rb:352:in `init'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry/pry_class.rb:425:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/Users/viktor/.local/gel/ruby/gems/pry-0.12.2/lib/pry.rb:119:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/Users/viktor/.local/gel/ruby/gems/pry-byebug-3.7.0/lib/pry-byebug.rb:3:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/rubygems.rb:188:in `require'
/usr/local/Cellar/gel/0.2.0/lib/gel/environment.rb:569:in `scoped_require'
/usr/local/Cellar/gel/0.2.0/lib/gel/gemfile_parser.rb:128:in `block in autorequire'
/usr/local/Cellar/gel/0.2.0/lib/gel/gemfile_parser.rb:122:in `each'
/usr/local/Cellar/gel/0.2.0/lib/gel/gemfile_parser.rb:122:in `autorequire'
/usr/local/Cellar/gel/0.2.0/lib/gel/environment.rb:493:in `require_groups'
/usr/local/Cellar/gel/0.2.0/lib/gel/compatibility/bundler.rb:9:in `require'
/Users/viktor/Developer/pop/config/application.rb:19:in `<top (required)>'
/Users/viktor/Developer/pop/Rakefile:6:in `require_relative'
/Users/viktor/Developer/pop/Rakefile:6:in `<top (required)>'
/Users/viktor/.local/gel/ruby/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/exec.rb:34:in `load'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/exec.rb:34:in `run'
/usr/local/Cellar/gel/0.2.0/lib/gel/command/stub.rb:8:in `run'
/usr/local/Cellar/gel/0.2.0/lib/gel/command.rb:13:in `run'
/usr/local/bin/gel:13:in `<main>'
(See full trace by running task with --trace)

ruby_home doesn't work with gel 0.3.0

[aaron@tc-lan-adapter ~/g/tenderhome (master)]$ cat Gemfile 
gem 'ruby_home'
[aaron@tc-lan-adapter ~/g/tenderhome (master)]$ gel install
Fetching sources...
Resolving dependencies...

===== Gel Internal Error =====

Traceback (most recent call last):
	9: from /Users/aaron/.rbenv/versions/ruby-trunk/lib/ruby/gems/2.7.0/gems/gel-0.3.0/exe/gel:13:in `<main>'
	8: from /Users/aaron/.rbenv/versions/ruby-trunk/lib/ruby/gems/2.7.0/gems/gel-0.3.0/lib/gel/command.rb:13:in `run'
	7: from /Users/aaron/.rbenv/versions/ruby-trunk/lib/ruby/gems/2.7.0/gems/gel-0.3.0/lib/gel/command/install.rb:5:in `run'
	6: from /Users/aaron/.rbenv/versions/ruby-trunk/lib/ruby/gems/2.7.0/gems/gel-0.3.0/lib/gel/environment.rb:410:in `activate'
	5: from /Users/aaron/.rbenv/versions/ruby-trunk/lib/ruby/gems/2.7.0/gems/gel-0.3.0/lib/gel/environment.rb:227:in `lock'
	4: from /Users/aaron/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:41:in `work'
	3: from /Users/aaron/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:69:in `propagate'
	2: from /Users/aaron/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:69:in `reverse_each'
	1: from /Users/aaron/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:72:in `block in propagate'
/Users/aaron/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:233:in `resolve_conflict': Could not find compatible versions (PubGrub::SolveFailure)

Because no versions satisfy ruby_home >= 0
  and root depends on ruby_home >= 0,
  version solving has failed.

I guess this is a PubGrub failure, but I'm not 100% sure. cc @jhawthorn

`gem install ...` broken after install

After installing and performing $(gel shell-setup), running gem install mailcatcher or anything similar simply hangs. Additionally, any binaries previously installed by gems fail with something like:

===== Gel Internal Error =====

Traceback (most recent call last):
	1: from /usr/local/rbenv/gems/2.6.0/bin/mailcatcher:23:in `<main>'
/usr/local/Cellar/gel/HEAD-40287c8/lib/gel/compatibility/rubygems.rb:159:in `activate_bin_path': Unknown gem "mailcatcher" (RuntimeError)

Error installing `aws-sdk-resources`

Seem there are some issues when installing aws-sdk-resources. And here is the log.

===== Gel Internal Error =====

Traceback (most recent call last):
	21: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
	20: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:46:in `catch'
	19: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
	18: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:47:in `loop'
	17: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:62:in `block (4 levels) in start'
	16: from /usr/local/Cellar/gel/0.3.0/lib/gel/installer.rb:69:in `block (2 levels) in install_gem'
	15: from /usr/local/Cellar/gel/0.3.0/lib/gel/installer.rb:122:in `work_download'
	14: from /usr/local/Cellar/gel/0.3.0/lib/gel/installer.rb:140:in `work_install'
	13: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:224:in `install'
	12: from /usr/local/Cellar/gel/0.3.0/lib/gel/store.rb:39:in `add_gem'
	11: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:81:in `writing'
	10: from /Users/adam00/.rbenv/versions/2.6.5/lib/ruby/2.6.0/monitor.rb:235:in `mon_synchronize'
	 9: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:84:in `block in writing'
	 8: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:157:in `writing'
	 7: from /usr/local/Cellar/gel/0.3.0/lib/gel/store.rb:53:in `block in add_gem'
	 6: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:130:in `[]='
	 5: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:212:in `[]='
	 4: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:212:in `map'
	 3: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:212:in `each'
	 2: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:212:in `times'
	 1: from /usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:213:in `block in []='
/usr/local/Cellar/gel/0.3.0/lib/gel/db.rb:213:in `[]=': sdbm_store failed (SDBMError)

Support one-off gem installation

Since gel serves as an alternative to both the gem and bundle CLIs, some basic commands for dealing with one-off gem installations outside the context of a Gemfile would be neat.

$ gel install standard

Should, I would think, install the latest version of standard and point a shim to it in gel's binstubs.

(This seems necessary to me, because right now the only way to create a Rails project with gel would be to first create a Gemfile that contains gem "rails" and run gel install, which would then let us run rails new from other directories)

Internal error activating bin path

sams-MBP:discourse sam$ eval "$(gel shell-setup)"
sams-MBP:discourse sam$ gel exec rails r 'User.first'


===== Gel Internal Error =====

Traceback (most recent call last):
	1: from /Users/sam/.rbenv/versions/2.6.1/bin/gel:23:in `<main>'
/Users/sam/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/gel-0.2.0/lib/gel/compatibility/rubygems.rb:150:in `activate_bin_path': Unknown gem "gel" (RuntimeError)

Using rbenv/mac/bash/Ruby 2.6.1

Uninstalling and reinstalling gel fails

I tried doing these things on rbenv-managed ruby 2.6.1p33, installing, uninstalling, and reinstalling gel:

$ gem install gel
$ eval "$(gel shell-setup)"
$ gel
$ gem uninstall gel
$ rm -rf ~/.local/gel
$ gem install gel

Now, running any gel command gives this error:

$ gel


===== Gel Internal Error =====

Traceback (most recent call last):
	1: from /Users/justin/.rbenv/versions/2.6.1/bin/gel:23:in `<main>'
/Users/justin/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/gel-0.2.0/lib/gel/compatibility/rubygems.rb:150:in `activate_bin_path': Unknown gem "gel" (RuntimeError)

Thoughts? What's the right way to uninstall/reinstall gel? (The reason I'd like to be able to implode and reinstall gel easily is to more accurately replicate any issues I find)

gel ignores gemspec definition

Hi!

Given this gem file:

# frozen_string_literal: true

source "https://rubygems.org"

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

gem "rails", "6.1.0"
gem "active_record_distinct_on"

bundler 2.1.4, throws this error:

Bundler could not find compatible versions for
gem "activemodel":
  In snapshot (Gemfile.lock):
    activemodel (= 6.0.3.4)

  In Gemfile:
active_record_distinct_on was resolved to
0.1.7, which depends on
activerecord (>= 4.2, < 6.1) was resolved
to 6.0.3.4, which depends on
        activemodel (= 6.0.3.4)

rails (= 6.1.0) was resolved to 6.1.0,
which depends on
      activemodel (= 6.1.0)

Running `bundle update` will rebuild your
snapshot from scratch, using only
the gems in your Gemfile, which may resolve the
conflict.

while gel install runs successfully.

active_record_distinct_on gemspec specifies - < 6.1 on rails version - https://github.com/alecdotninja/active_record_distinct_on/blob/master/active_record_distinct_on.gemspec#L20

Looks like a bug in gel, or something else which I don't understand.

Requiring version in gemspec from git source fails

Using resque-pause from GitHub with gel fails with:

Fetching sources.....
Resolving dependencies...Traceback (most recent call last):
	7: from -e:1:in `<main>'
	6: from /Users/kaspth/.gem/ruby/2.6.0/gems/gel-0.3.0/lib/gel/gemspec_parser.rb:90:in `parse'
	5: from /Users/kaspth/.gem/ruby/2.6.0/gems/gel-0.3.0/lib/gel/gemspec_parser.rb:90:in `chdir'
	4: from /Users/kaspth/.gem/ruby/2.6.0/gems/gel-0.3.0/lib/gel/gemspec_parser.rb:91:in `block in parse'
	3: from /Users/kaspth/.gem/ruby/2.6.0/gems/gel-0.3.0/lib/gel/gemspec_parser.rb:91:in `eval'
	2: from /Users/kaspth/.local/gel/git/resque-pause-45d8b943d8586/resque-pause.gemspec:5:in `context'
	1: from /Users/kaspth/.gem/ruby/2.6.0/gems/gel-0.3.0/lib/gel/gemspec_parser.rb:26:in `new'
/Users/kaspth/.local/gel/git/resque-pause-45d8b943d8586/resque-pause.gemspec:7:in `block in context': uninitialized constant Gel::GemspecParser::Context::Resque (NameError)
ERROR: Gemspec parse failed

Resque isn't defined at the time because the earlier require "version" ends up resolving to another activated gem's version.rb (in my testing from base32) via

super Gel::Environment.resolve_gem_path(path)

Not sure what the right solution is here, if Gel needs to activate the gem before parsing the gemspecs.

Reproduction script

set -ex

mkdir -p holder
cd holder

cat << GEMFILE > Gemfile
source "https://rubygems.org"

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

gem "resque-pause", github: "wandenberg/resque-pause"
GEMFILE

gel lock

Duplicate entry for gem should just be a warning instead?

ERROR: Failed to evaluate ".../Gemfile": Duplicate entry for gem "pry-rails"

This is what I have in Gemfile:

gem "pry-rails", require: "pry-rails/console", group: [:production]

group :development, :test do
  gem "pry-rails"
...

Gem already installed on first run should not fail with a non-zero error

Already install gems should not fail after the first run with a non-zero error. This is happening with the case of ruby_parser. See dockerfile:

FROM ruby:2.6.4-alpine

RUN apk --no-cache update && apk add --update alpine-sdk tzdata linux-headers
    gem update --system && gem install gel && \
    apk add --update postgresql-client postgresql-dev && \
    apk add --update nodejs


RUN mkdir -p /app
WORKDIR /app
ENTRYPOINT ["/app/entrypoint.sh"]
CMD ["rackup", "--host", "0.0.0.0", "-p", "3000"]

ADD Gemfile Gemfile.lock .ruby-version ./
RUN gel install --jobs 5

COPY . ./

The error is dispatched locally and in the pipeline(just trying to see time improvement in real environments branches):
image

Resolving dependency with no requirement for the first time errors out

When we run gel install against following Gemfile and there is no lockfile yet:

# frozen_string_literal: true

source "https://rubygems.org"

gem "railties"

resulted in an error:

Fetching sources....
Resolving dependencies....


===== Gel Internal Error =====

Traceback (most recent call last):
	9: from /Users/juanitofatas/src/github.com/matthewd/gel/exe/gel:13:in `<main>'
	8: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/command.rb:13:in `run'
	7: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/command/install.rb:5:in `run'
	6: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/environment.rb:361:in `activate'
	5: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/environment.rb:299:in `lock'
	4: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:161:in `dump'
	3: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:113:in `block in dump'
	2: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:113:in `each'
	1: from /Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:117:in `block (2 levels) in dump'
/Users/juanitofatas/src/github.com/matthewd/gel/lib/gel/resolved_gem_set.rb:117:in `sort': comparison of Array with String failed (ArgumentError)

But if there already had a Gemfile.lock, no error.

common dependencies across component engines

getting the following when running gel install:

ERROR: Failed to evaluate "/Users/jpowell/src/spree/Gemfile": undefined method 'eval_gemfile' for #<Gel::GemfileParser::ParseContext:0x00007f865c0da810>
/Users/jpowell/src/spree/Gemfile:1:in `parse'

see: eval_gemfile

on Spree, which shares common dependencies across component engines:

https://github.com/spree/spree/blob/756c8657a11291feb009bce901363963fa3b5d9d/Gemfile#L1

Is there a way to handle with gel?

Unknown lockfile section

When I have Gemfile.lock file with follow section:

RUBY VERSION
   ruby 2.5.1p57

I catch this message "Unknown lockfile section "RUBY VERSION""

First gel install fails: compiling binaries block each other

Installing alpha3 and having run rm -rf ~/.local/gel then running gel install for Rails gets me:

Errors encountered with 4 gems:

eventmachine
  won't overwrite /Users/kaspth/.local/gel/ruby/gems/pub_grub-0.5.0.alpha3/.gitignore

websocket-driver
  won't overwrite /Users/kaspth/.local/gel/ruby/gems/pub_grub-0.5.0.alpha3/.gitignore

ffi
  won't overwrite /Users/kaspth/.local/gel/ruby/gems/pub_grub-0.5.0.alpha3/.gitmodules

thin
  Depends on "eventmachine", which failed to compile



===== Gel Internal Error =====

Traceback (most recent call last):
	22: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
	21: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/work_pool.rb:46:in `catch'
	20: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
	19: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/work_pool.rb:47:in `loop'
	18: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/work_pool.rb:62:in `block (4 levels) in start'
	17: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/installer.rb:69:in `block (2 levels) in install_gem'
	16: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/installer.rb:111:in `work_download'
	15: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:124:in `extract'
	14: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:124:in `open'
	13: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:125:in `block in extract'
	12: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/support/tar/tar_reader.rb:29:in `new'
	11: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:142:in `block (2 levels) in extract'
	10: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package/installer.rb:16:in `gem'
	 9: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:143:in `block (3 levels) in extract'
	 8: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:107:in `with_file'
	 7: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/support/tar/tar_reader.rb:116:in `seek'
	 6: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:119:in `block in with_file'
	 5: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:144:in `block (4 levels) in extract'
	 4: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/support/tar/tar_reader.rb:29:in `new'
	 3: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:145:in `block (5 levels) in extract'
	 2: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/support/tar/tar_reader.rb:65:in `each'
	 1: from /Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package.rb:146:in `block (6 levels) in extract'
/Users/kaspth/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/gel-2.0.0.alpha3/lib/gel/package/installer.rb:248:in `file': won't overwrite /Users/kaspth/.local/gel/ruby/gems/pub_grub-0.5.0.alpha3/.gitignore (RuntimeError)

Rerunning gel install right after succeeds:

kaspth@kaspth-imac:~/code/rails/activerecord (master)$ gel install
Installing websocket-driver (0.7.0)                                
Installing eventmachine (1.2.7) 
Installing thin (1.7.2)
Installing ffi (1.10.0)
Installed 4 gems

@matthewd knows what's up:

All the compiled gems try to build a temporary lockfile at the same time, and because it's the first run, they all decide they need to install pub_grub to do so

Thread deadlock

Uh oh, looks like there might be trouble in Gel::WorkPool, or something:

$ gel install
Installing msgpack (1.3.1)             
[Compiling: +1]Traceback (most recent call last):
	10: from /Users/sj26/Projects/gel/exe/gel:13:in `<main>'
	 9: from /Users/sj26/Projects/gel/lib/gel/command.rb:13:in `run'
	 8: from /Users/sj26/Projects/gel/lib/gel/command/install.rb:5:in `run'
	 7: from /Users/sj26/Projects/gel/lib/gel/environment.rb:370:in `activate'
	 6: from /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:68:in `activate'
	 5: from /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:68:in `new'
	 4: from /Users/sj26/Projects/gel/lib/gel/work_pool.rb:30:in `initialize'
	 3: from /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:106:in `block in activate'
	 2: from /Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `wait'
	 1: from /Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `each'
/Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `join': No live threads left. Deadlock? (fatal)
13 threads, 13 sleeps current:0x00007fc84be0fb10 main thread:0x00007fc8466057a0
* #<Thread:0x00007fc847060010 sleep_forever>
   rb_thread_t:0x00007fc8466057a0 native:0x00000001076625c0 int:0
   /Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `join'
   /Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `each'
   /Users/sj26/Projects/gel/lib/gel/installer.rb:193:in `wait'
   /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:106:in `block in activate'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:30:in `initialize'
   /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:68:in `new'
   /Users/sj26/Projects/gel/lib/gel/lock_loader.rb:68:in `activate'
   /Users/sj26/Projects/gel/lib/gel/environment.rb:370:in `activate'
   /Users/sj26/Projects/gel/lib/gel/command/install.rb:5:in `run'
   /Users/sj26/Projects/gel/lib/gel/command.rb:13:in `run'
   /Users/sj26/Projects/gel/exe/gel:13:in `<main>'
* #<Thread:0x00007fc84ada37b0@/Users/sj26/Projects/gel/lib/gel/installer.rb:186 sleep_forever>
   rb_thread_t:0x00007fc84be0f580 native:0x000070000d594000 int:0
    depended by: tb_thread_id:0x00007fc8466057a0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:104:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:101:in `wait'
   /Users/sj26/Projects/gel/lib/gel/installer.rb:189:in `block (2 levels) in wait'
* #<Thread:0x00007fc84ada3698@/Users/sj26/Projects/gel/lib/gel/installer.rb:186 sleep_forever>
   rb_thread_t:0x00007fc84be0fb10 native:0x000070000d697000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:104:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:101:in `wait'
   /Users/sj26/Projects/gel/lib/gel/installer.rb:189:in `block (2 levels) in wait'
* #<Thread:0x00007fc84ada3558@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be0ffa0 native:0x000070000d79a000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84ada3418@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be10430 native:0x000070000d89d000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84ada3328@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be108f0 native:0x000070000d9a0000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84ada3238@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be10db0 native:0x000070000daa3000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84ada3148@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be11270 native:0x000070000dba6000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84ada3058@gel-download@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84be11730 native:0x000070000dca9000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84b613170@gel-compile@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84b914970 native:0x000070000ddac000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84b612e78@gel-compile@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84ba6de60 native:0x000070000deaf000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84b612c20@gel-compile@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84ba34bc0 native:0x000070000dfb2000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
* #<Thread:0x00007fc84b612a40@gel-compile@/Users/sj26/Projects/gel/lib/gel/work_pool.rb:42 sleep_forever>
   rb_thread_t:0x00007fc84ba31ff0 native:0x000070000e0b5000 int:0
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `sleep'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:111:in `block (2 levels) in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:110:in `block in wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `handle_interrupt'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:106:in `wait'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:134:in `wait_until'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:51:in `block (5 levels) in start'
   /usr/local/rbenv/versions/2.6.2/lib/ruby/2.6.0/monitor.rb:230:in `mon_synchronize'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:49:in `block (4 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `loop'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `catch'
   /Users/sj26/Projects/gel/lib/gel/work_pool.rb:46:in `block (2 levels) in start'

This was happening repeatedly for me. :-(

Partial updates

@jhawthorn the other version-preference thing I need to look at next is the variant of install / update that respects some or all of the existing locks, only changing what it must.

Do you have any thoughts on how we go about that? Is it as simple as sorting the previously-locked version to the top of the list ahead of the rest in normal order? That intuitively feels like it's too simplistic to work, but I can't come up with a reason it wouldn't. 🤔

Internal error when trying to use gel

@cloudtop:/dev/badge$ which gel
/usr/local/google/home/samphippen/.gem/ruby/2.5.3/bin/gel
@cloudtop:
/dev/badge$ eval "$(gel shell-setup)"
@cloudtop:~/dev/badge$ gel install

===== Gel Internal Error =====

Traceback (most recent call last):
1: from /usr/local/google/home/samphippen/.gem/ruby/2.5.3/bin/gel:23:in <main>' /usr/local/google/home/samphippen/.gem/ruby/2.5.3/gems/gel-0.2.0/lib/gel/compatibility/rubygems.rb:150:in activate_bin_path': Unknown gem "gel" (RuntimeError)
@cloudtop:~/dev/badge$

Blowup when gem spec has extensions defined as an array

To repro, clone puma and run gem install from the gem root.

Traceback (most recent call last):
	8: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/exe/gel:13:in `<main>'
	7: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/command.rb:13:in `run'
	6: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/command/install.rb:5:in `run'
	5: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:419:in `activate'
	4: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/lock_loader.rb:160:in `activate'
	3: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:537:in `gems_from_lock'
	2: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:537:in `each'
	1: from /Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:538:in `block in gems_from_lock'
/Users/nateberkopec/.gem/ruby/2.6.3/gems/gel-0.3.0/lib/gel/store_gem.rb:31:in `require_paths': [["ext/puma_http11/extconf.rb"]] (RuntimeError)

[Question] Add default command

> bin/gel
Gel doesn't have a default command; please run `gel install`

What do you think about to add default command, like in bundler, for running install?

Cyclic dependency

I was trying to install the HEAD of gel via homebrew by adding a head "https://github.com/gel-rb/gel.git" to the hombrew formula, but it fails while generating man pages with:

ronn --roff --manual 'Gel Manual' man/man1/gel-exec.1.ronn man/man1/gel-install.1.ronn man/man1/gel.1.ronn
/private/tmp/gel-20190807-63682-1ivzf57/lib/gel/catalog/marshal_hacks.rb:3:in `<top (required)>': uninitialized constant Gem (NameError)
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/catalog/dependency_index.rb:10:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/catalog/dependency_index.rb:10:in `<top (required)>'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/catalog.rb:152:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/catalog.rb:152:in `<top (required)>'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:10:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:10:in `initialize'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:84:in `new'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:84:in `block (2 levels) in load'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:59:in `each'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:59:in `block in load'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:55:in `each'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/resolved_gem_set.rb:55:in `load'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/lock_loader.rb:9:in `initialize'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/environment.rb:365:in `new'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/environment.rb:365:in `activate'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/runtime.rb:26:in `<top (required)>'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/compatibility/rubygems.rb:9:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/compatibility/rubygems.rb:9:in `<top (required)>'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/compatibility.rb:4:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/compatibility.rb:4:in `<top (required)>'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/command.rb:3:in `require_relative'
	from /private/tmp/gel-20190807-63682-1ivzf57/lib/gel/command.rb:3:in `<top (required)>'
	from bin/gel:12:in `require_relative'
	from bin/gel:12:in `<main>'
rake aborted!
Command failed with status (1): [ronn --roff --manual 'Gel Manual' man/man1...]
/private/tmp/gel-20190807-63682-1ivzf57/Rakefile:44:in `block in <top (required)>'
-e:1:in `<main>'
Tasks: TOP => man
(See full trace by running task with --trace)

lib/gel/catalog/marshal_hacks.rb seems to presume the the Gem module exists, but this is being required in the same stack that is trying to load the lib/gel/compatibility/rubygems.rb file which defines the module. Any ideas?

Version preference/priority

@jhawthorn testing on buildkite/buildkite*, I just encountered a variant of https://github.com/matthewd/paperback/blob/6773b9fb9cc3bb0682e9fe63aac90bf33f75707d/test/resolve_test.rb#L486-L494

Specifically, note that the foreman/thor versions change if you remove gem "thunk", even though its dependency is non-restrictive.

Neither is wrong: the latest foreman is only compatible with older thor, and the latest thor is only compatible with older foreman. My intuition is that we should prefer the newer version of the more direct dependency... which is also how Bundler resolved my real scenario. I haven't researched whether that's conscious choice, or just a different arbitrary decision, but I figured it's at least worth a look: do you know if this is something we can affect by e.g. sorting, or best dismissed as unimportant?

(Removing gem "dotenv" changes things too, but that one seems even more like both answers are equally right, as it's duelling top-level dependencies.)

* 14s paperback lock vs 74s bundle lock, but only 2s of ours was resolution -- the other 12s were all slow requests that I need to speed up, cache, or parallelize.

Allow vendoring of gems

Bundler supports vendoring gems into a specified directory. Some apps rely on this feature so they don't need to download from RubyGems if the gem is already present.

Once vendoring is implemented we'll want to have a way to clean the gems that are no longer used. To make that work for apps that dual-boot in multiple Rails version we'll need a way to set a list of gems to not clean.

gel install fails with gem yet to be pushed to Rubygems

I was trying to run gel install in a library I was considering as a gem, it had a gemspec but was yet to be pushed to Rubygems. I'm investigating why as sometimes it appears to install fine but in the meantime I'll put this here. I know it happens on both master (d5e4aa3) and v0.3.0 and Ruby 2.6.3 and 2.7.0.

I've pushed up the library to Github and to Rubygems (and yanked it) for investigating this, but here's the original error message:

$ gel install
Fetching sources.....
Resolving dependencies...

===== Gel Internal Error =====

Traceback (most recent call last):
	10: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/exe/gel:13:in `<main>'
	 9: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/lib/gel/command.rb:13:in `run'
	 8: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/lib/gel/command/install.rb:5:in `run'
	 7: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/lib/gel/environment.rb:366:in `activate'
	 6: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/lib/gel/environment.rb:328:in `write_lock'
	 5: from /Users/iainb/.gem/ruby/2.6.3/gems/gel-0.3.0a/lib/gel/environment.rb:232:in `solve_for_gemfile'
	 4: from /Users/iainb/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:41:in `work'
	 3: from /Users/iainb/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:69:in `propagate'
	 2: from /Users/iainb/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:69:in `reverse_each'
	 1: from /Users/iainb/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:72:in `block in propagate'
/Users/iainb/.local/gel/ruby/gems/pub_grub-0.5.0/lib/pub_grub/version_solver.rb:233:in `resolve_conflict': Could not find compatible versions (PubGrub::SolveFailure)

Because every version of [[gemfile]] depends on Docopted (ruby) >= 0
  and no versions satisfy Docopted (ruby) >= 0,
  every version of [[gemfile]] is forbidden.
So, because every version of [[root]] depends on [[gemfile]] >= 0
  and (root dependency),
  version solving has failed.

Regards,
iain

`gell install` fails with rdkafka

Hi!

I am trying moving to gel on my main repo and I fail to install rdkafka-ruby
Gemfile:

# frozen_string_literal: true

source "https://rubygems.org"

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

gem "rdkafka", git: "https://github.com/bringg/rdkafka-ruby", branch: "add_response_to_delivery_report"

Output:

λ ~/code/gel-test/ gel install
Fetching sources.....
Resolving dependencies....
Writing lockfile to /Users/yosi/code/bringg/gel-test/Gemfile.lock
Installing ffi (1.11.2)
Installed 1 gems


===== Gel Internal Error =====

Traceback (most recent call last):
        8: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/exe/gel:13:in `<main>'
        7: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/command.rb:13:in `run'
        6: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/command/install.rb:5:in `run'
        5: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:419:in `activate'
        4: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/lock_loader.rb:160:in `activate'
        3: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:537:in `gems_from_lock'
        2: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:537:in `each'
        1: from /Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/environment.rb:538:in `block in gems_from_lock'
/Users/yosi/.rvm/gems/ruby-2.6.3/gems/gel-0.3.0/lib/gel/store_gem.rb:31:in `require_paths': ["/Users/yosi/.local/gel/git/rdkafka-ruby-19bbeef9cf38c/lib", ["ext/Rakefile"]] (RuntimeError)

The problems happen only if I install it from git, otherwise it just works.

If you can direct me through I can submit a PR to fix it.

JRuby gel install platform issue?

gel lock seems to work ok (as far as I can tell) but gel install cannot find the java platform gems:

jruby -S gel install
Fetching sources.....
Resolving dependencies......
Writing lockfile to /home/enebo/work/puma/Gemfile.lock
Installed 0 of 3 gems

Errors encountered with 3 gems:

jruby-openssl
  Unable to locate jruby-openssl 0.10.2 in: https://rubygems.org/

jaro_winkler
  make exited with 2

nio4r
  extconf exited with 1



===== Gel Internal Error =====

RuntimeError: Unable to locate jruby-openssl 0.10.2 in: https://rubygems.org/
   download_gem at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/installer.rb:104
  work_download at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/installer.rb:108
    install_gem at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/installer.rb:69
          start at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/work_pool.rb:62
           loop at org/jruby/RubyKernel.java:1425
          start at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/work_pool.rb:47
          catch at org/jruby/RubyKernel.java:1193
          start at /home/enebo/work/jruby/lib/ruby/gems/shared/gems/gel-0.2.0/lib/gel/work_pool.rb:46

This is from the puma repository. I did an earlier gel install and the rest of the gems installed fine. Could this just be something to do with platform?

CLI help options

It would be great to have a simple cli help doc.

gel -h
gel --help

Alternative to bundler?

When I think of "gem management" I think of "bundler".
https://github.com/gel-rb/gel/i
also is a "gem manager".
So it would be useful to have in the README a subsection about how it differs-from/competes-with the old' classic - that is bundler.

Support multiple lock files for Gemfile

To ease upgrading Rails versions we have multiple Gemfile.lock's. I think that ideally we'd support something like https://github.com/shopify/bootboot that let's you set an env var to flip between different Rails versions (or other versions) and can have 2+ lock files. I don't think gel should only support 2 lock files, it should support as many as an app wants.

gel lock puts lock file in strange places

Hi there,

If I have an existing Gemfile.lock in the current directory / project root and run gel lock then I get the following:

$ gel lock
Fetching sources....
Resolving dependencies...
Writing lockfile to PROJECT_ROOT/Gemfile.lock

It always works if the lock file exists.

If it doesn't exist then it decides to put it in a parent of the project root. The first time I ran it, it was one level up, 2nd time it's 3 levels up… and I just ran it again after removing the lock file and this time it placed it in the project root.

I haven't looked into why, I'll do that now and report back if I find anything.

Aside from that, amazed by the speed of it, great work!

Regards,
iain

Deadlock in tail_file_test.rb?

If I run test_interleaved_async_requests repeatedly, it deadlocks (maybe others?).

I use autoclave, but you could just run it in a loop and wait until it hands.

autoclave -v -r 50 -t 2 bin/metaruby -Itest test/tail_file_test.rb -n 'test_interleaved_async_requests'

Issue installing sassc

Hello. Very excited by gel :)

I'm on a brand new machine (mac) starting a new rails project (Exercism v3!) on Ruby 2.7.1. I'm using ruby-install and chruby. Running gel install fails with sassc. Running bundle install works. I suspect this may be a duplicate of #96, but would like to ideally leave it open so that I can try/test when that's added and start using gel :) If it's not a duplicate and there's something I'm doing wrong, any help would be greatly appreciated!

➜ gel install
Installed 0 of 1 gems

Errors encountered with 1 gems:

sassc
  extconf exited with 1



===== Gel Internal Error =====

Traceback (most recent call last):
	14: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:46:in `block (2 levels) in start'
	13: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:46:in `catch'
	12: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:47:in `block (3 levels) in start'
	11: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:47:in `loop'
	10: from /usr/local/Cellar/gel/0.3.0/lib/gel/work_pool.rb:62:in `block (4 levels) in start'
	 9: from /usr/local/Cellar/gel/0.3.0/lib/gel/installer.rb:118:in `block (2 levels) in work_download'
	 8: from /usr/local/Cellar/gel/0.3.0/lib/gel/installer.rb:134:in `work_compile'
	 7: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:206:in `compile'
	 6: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:206:in `each'
	 5: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:209:in `block in compile'
	 4: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:154:in `compile_extconf'
	 3: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:88:in `with_build_environment'
	 2: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:88:in `open'
	 1: from /usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:89:in `block in with_build_environment'
/usr/local/Cellar/gel/0.3.0/lib/gel/package/installer.rb:163:in `block in compile_extconf': extconf exited with 1 (RuntimeError)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.