Hi Aaron,

On 25/09/2012, at 19:33, Aaron Patterson <[email protected]> wrote:

> On Tue, Sep 25, 2012 at 06:58:45AM -0700, excsm wrote:
>> Hi,
>> 
>> I initially sent this idea as a github 
>> issue: https://github.com/rails/rails/issues/7753 (closed)
>> 
>> Steve Klabnik suggested I should post here first (better late than never).
>> 
>> I've since created a PR: https://github.com/rails/rails/pull/7755
>> 
>> Original discussion:
>> ==============
>> 
>> 
>> I'm using the relatively new --standalone feature/option of bundler so as 
>> to avoid extracting a part of my rails project into a separate project. My 
>> only requirement is to not have to load rails entirely:
>> 
>> By creating a custom gemfile (subset of your typical gemfile) and executing:
>> 
>>    bundle install --gemfile=Gemfile.my_subset --standalone
>> 
>> bundler will create a ruby script which requires all the gems in your 
>> gemfile subset using the
>> original gems locations.
>> 
>> e.g. :
>> 
>>    path = File.expand_path('..', __FILE__)
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/rake-0.9.2.2/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/multi_json-1.0.4/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/activesupport-3.1.6/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/builder-3.0.3/lib")
>>    $:.unshift File.expand_path("#{path}/../ruby/1.9.1/gems/i18n-0.6.0/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/activemodel-3.1.6/lib")
>>    $:.unshift File.expand_path("#{path}/../ruby/1.9.1/gems/arel-2.2.3/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/tzinfo-0.3.33/lib")
>>    $:.unshift 
>> File.expand_path("#{path}/../ruby/1.9.1/gems/activerecord-3.1.6/lib")
>>    ...
>> 
>> This allows scripts to e.g. load just activerecord without setting up a 
>> separate
>> gemfile.
>> 
>> The issue here is that with this setup script, you aren't using bundler (to 
>> avoid loading rails and 
>> the gems in your typical gemfile.). Additionally, the gems the script 
>> requires are `expanded` gems
>> and have not been installed via `gem install`.
>> 
>> Activerecord connection adapters have this code:
>> 
>>    gem 'mysql2', '~> 0.3.10'
>>    require 'mysql2'
>> 
>> This code assumes:
>> 
>>  * You're running the code within bundler (recommended)
>>  * You have the mysql2 gem installed as a gem in your system
>> 
>> When using bundler standalone neither of these cases are true so the app 
>> breaks with:
>> 
>>   Please install the mysql2 adapter: `gem install 
>> activerecord-mysql2-adapter` (no such file to load -- 
>> active_record/connection_adapters/mysql2_adapter)
>> because it hits the 'gem' call before it attempts to require 'mysql2'
>> 
>> IMHO a better approach would be:
>> 
>>    begin
>>      require 'mysql2'
>>    rescue LoadError
>>      gem 'mysql2', '~> 0.3.10'
>>      require 'mysql2'
>>    end
>> 
>> This code assumes you already have mysql2 on your load path somehow and 
>> only if it raises an exception do we attempt to issue the `gem` call.
> 
> If you have mysql2 on your system, the `gem` call will never be made
> (defeating the purpose of the `gem` call in the first place).
> 
>> Is this reasonable?
> 
> If we don't use the `gem` command, we can't enforce a particular version
> of mysql2 in the adapter code.  Since AR has "soft dependencies"
> (dependencies that are not declared in the gemspec), we need some way to
> ensure that we've loaded a connection handling gem that has the version
> we actually support.  Doing a `require 'mysql2'` could pick up *any*
> version of mysql2, including one that won't actually work with the
> AR adapter code.

I understand though I think it sucks…

What about something like:

    begin
       gem 'mysql2', '~> 0.3.11'
       require 'mysql2'
    rescue LoadError
      puts "You do not appear to have mysql2 (~> 0.3.11) installed. AR requires 
this to function correctly."

      begin 
        require 'mysql2'
        puts "Found some version of mysql2. Proceeding..."
      rescue LoadError => err
        raise err
      end
    end

Then you leave the responsibility up to the developer…

> 
> -- 
> Aaron Patterson
> http://tenderlovemaking.com/

Saimon



-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to