How to add dependency of a local gem to a rails plugin/engine, in .gemspec file

后端 未结 3 1162
自闭症患者
自闭症患者 2021-01-03 19:17

I had tried in this way:

 s.add_dependency \'gem\', :path => \'../gem\'

like add gem in the gemfile, but it doesn\'t work,

相关标签:
3条回答
  • 2021-01-03 19:46

    While developing 2 gems, gem1 and gem2, requiring that gem1 locally depends on gem2 is quite handy.

    You can't do this in your gemspec, however, you can do so in your gem's Gemfile!

    # Gemfile
    source "https://rubygems.org"
    
    gem 'gem2', :path => '../gem2'
    
    # Specify your gem's dependencies in gem1.gemspec
    gemspec
    

    And then in your gemspec, require your gem like you would normally if that gem was already published:

    # gem1.gemspec
    spec.add_runtime_dependency "gem2"
    

    Just make sure you don't accidentally push that Gemfile change!

    0 讨论(0)
  • 2021-01-03 19:49

    It's likely not possible to add local dependencies because other users will not be able to access the gem as it is local dependent and hence of no use after publish. Instead of that, Add remote dependency in your own plugin's gemspec.

    Steps -

    1) Open gemspec file of your own plugin in vendor/plugins/my_plugin/ and add before the keyword end:

    s.add_dependency('will_paginate', '~> 3.0.pre2')
    

    (In this example I have used will_paginate required dependency of my_plugin)

    2) Now go in your rails app and edit Gemfile, add:

    gem 'my_plugin', path: 'vendor/plugins/my_plugin'
    

    3) Now in rails app root do:

    bundle install
    

    And dependency of my_plugin (will_paginate in this case) is installed.

    0 讨论(0)
  • 2021-01-03 19:51

    Sometimes you want to embed one gem into another gem, nevermind why. You can reference one gempec from another to completely encapsulate a local gem.

    require "rubygems"
    
    embedded_gemspec = Gem::Specification::load("path/to/internal.gemspec")
    
    Gem::Specification.new do |spec|
      spec.name          = "gem_that_contains_another_gem"
      # spec.whatever,   = whole bunch of other info
    
      #                     our files               + other gem's files
      spec.files         = ['file1.rb', 'file2.rb'] + embedded_gemspec.files
    
      # our dependencies
      spec.add_dependency 'nokogiri'
      # other gem's dependencies
      embedded_gemspec.runtime_dependencies.each { |d| spec.add_dependency d }
    
    end
    

    EDIT: this appears to only work locally. If you try to install this gemspec from, say, a git repo, it won't know where to get embedded_gemspec (even though embedded_gemspec's dependencies come in just fine).

    0 讨论(0)
提交回复
热议问题