Heroku部署无法加载自定义.bundle文件

时间:2019-08-14 19:17:22

标签: ruby-on-rails ruby heroku

由于bundler不断出现,我在搜索此问题时遇到了很多麻烦。但是,我的问题是使用mkmfruby c api捆绑在一起的c库。我已经将我的C代码编译到一个文件中(例如my_library.bundle),并且我需要在require_relative "my_library"的帮助器中使用它而没有问题。

当我部署到heroku并收到错误消息时,问题再次出现:

2019-08-14T19:09:15.452530+00:00 app[web.1]: /app/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require': cannot load such file -- /app/app/helpers/my_library (LoadError)

我可以在我的heroku应用程序上运行lscat来验证文件在那里并且内容匹配。当我使用RAILS_ENV=production在本地运行应用程序时,也没有遇到任何问题。另外,在我的计算机上运行heroku local web可以正常运行。

这与我的配置autoload_paths有关系吗?我的主要问题是我似乎无法在本地调试它。

编辑: 我注意到这个问题也出现在dockerized实例中。似乎有关容器化的问题似乎是问题所在。我什至尝试创建一个包含this guide之后的包的gem,该包在本地工作,但是在查找文件时再次遇到相同的问题,但是这次路径是相对于gem的,而不是我的项目。我仍然对导致此问题的原因感到困惑。

3 个答案:

答案 0 :(得分:0)

根据您发布的错误,似乎Docker没有指向正确的路径cannot load such file -- /app/app/helpers/my_library。如果正确,则应在Dockerfile中显式指定工作目录。

WORKDIR /path/to/project

之后,只需重建图像即可。

现在,如果这不起作用,您可以在项目中检查autoload_paths或自定义引导,以避免自动加载路径出错。

答案 1 :(得分:0)

您可以做的是将整个my_library作为 local gem ,并将您的Gemfile指向该文件。 粗略地,轮廓如下:

  1. my_library的整个代码放在应用程序的目录中,例如fixtures(与Gemfile处于同一级别)。
    app/
      ...
    fixtures/
      my_library/
        ext/
          ...
        lib/
          ...
        my_library.gemspec
        Rakefile
    Gemfile
    
  2. 将您的Gemfile指向my_library gem:
    gem 'my_library', path: 'fixtures/my_library'
    
  3. 然后只需运行以下命令即可更新您的Gemfile.lock
    bundle update
    

答案 2 :(得分:0)

正如@ jay-dorsey所提到的,该捆绑确实需要在部署该应用程序的服务器上进行编译才能使用。我遵循的两个创建宝石的指南都有一些误导信息。

  1. gem应该仅包含源文件,而不能包含已编译的源文件
  2. rakefile应该引用ext.lib_dir = "lib/my_library"而不是ext目录
  3. gemspec应该在其他依赖项之前添加rake-compiler开发依赖项
  4. 版本文件不应尝试加载该扩展名,因为它在gemspec中使用,该扩展在gem有机会被rake / bundler编译之前被调用
  5. .bundle文件无法在Linux计算机上读取