包括在gemspec依赖于轨道引擎不添加到管道资产(Dependency included in g

2019-07-31 08:22发布

我正在写有一些依赖性的轨道引擎。 我指定的依赖在gemspec和发动机是找到他们,当我运行bundle install (即Gemfile.lock的看起来是正确的)。 当我想用这个插件在Ruby文件,我可以这样做,但需要明确require dependency-name在该文件的顶部。

然而,当我想用​​依赖的资产管道,链轮无法找到它。

我使用的(现在)这个应用程序是采用的是Rails插件的测试文件夹中的虚拟应用程序。 链轮可以找到资产,如果我在发动机的Gemfile中指定它们(这是真的假的应用程序的Gemfile中),但如果我在gemspec指定。 我不想依靠的Gemfile,因为这意味着使用我的插件的任何应用程序将需要我所有的依赖手动添加到他们的Gemfile。 出于同样的原因,我不希望出现这种情况涉及到更新应用程序的配置文件的解决方案。

这个工程(在ruby文件)时,依赖从gemspec包括:

require 'dependency-name'

但是,当依赖从gemspec列入本(在JS文件)不工作:

//= require 'dependency-name'

无论是require在依赖从Gemfile中包含的需要。 我认为这是非常清楚,但让我知道如果你需要更多的细节。

Answer 1:

我需要包括为了在我engine.rb明确依赖它的资产在我的素材资源管道告终。 不知道为什么,这是必要的,因为阿拉斯托的回答听起来正确的给我。 值得一提的是,依赖关系是我使用捆绑,虽然我不明白为什么应该有所作为创造宝石。

module MyRailsPluginFull
  class Engine < ::Rails::Engine
    require 'dependency1'
    require 'dependency2'
  end
end

新增12年11月23日

在花了一些时间与发动机的工作,我想我明白这更充分了。 Gemspecs只是被要求相关性列表,但gemspec没有指示应用程序在启动时,将文件从这些依赖加载。 Gemfiles,而另一方面,不要在启动过程中加载的所有文件。

新增2015年3月20日

我的发言从2年多前说:“Gemfiles,在另一方面,你在启动过程中加载的所有文件”并非完全如此。 这是Rails中,默认情况下运行大部分真正Bundler.require需要在Gemfile中列出的所有依赖关系,如图中产生的文件在这里 -注意,虽然Rails的默认行为从Rails3中改变轨道4所讨论的在这里 ,无论是使用Bundler.require 。 然而,对于使用被提出了强烈的情况下Bundler.setup然后明确require "dependency1"中的任何一个文件实际上取决于depedency1 。 见本次讨论的Bundler.requireBundler.setup

此外,作为@nruth在评论中指出,这可能导致不必要的类加载。 但是,如果这个依赖精心设计的,它的类大多会自动加载,对于需要整个依赖产生最小的开销。 或者,如果它定义的可以在孤立地需要一个文件的引擎,你可以只包括发动机文件,它应该在必要的文件添加到您的资源路径,使您可以要求其资产在你的CSS和JS体现。 见这个自举萨斯例如 ,其中的宝石都增加了其所有资产config.assets.paths ,并增加了它们中的一些config.assets.precompile

虽然这个问题是几岁了,我甚至不记得什么Rails的引擎我当时写的,我怀疑这样做会一直接近这个正确的方法:

module MyRailsPluginFull
  class Engine < ::Rails::Engine
    initializer 'bootstrap-sass.assets.precompile' do |app|
      require 'dependency1'

      # add dependency1's assets to the list of paths
      app.config.assets.paths << ...
    end
  end
end

但是请注意,这不应该是必要的 - 的依赖本身应该定义这个初始化,这样简单地要求其就足够了,如上面的例子举不。



Answer 2:

你根据你的设计的发动机http://edgeguides.rubyonrails.org/engines.html ? 如果你的引擎类从滑轨::引擎继承,它确实应该找到自己的所有资产。



文章来源: Dependency included in gemspec not added to asset pipeline in rails engine