由于bundler
不断出现,我在搜索此问题时遇到了很多麻烦。但是,我的问题是使用mkmf
和ruby 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应用程序上运行ls
和cat
来验证文件在那里并且内容匹配。当我使用RAILS_ENV=production
在本地运行应用程序时,也没有遇到任何问题。另外,在我的计算机上运行heroku local web
可以正常运行。
这与我的配置autoload_paths
有关系吗?我的主要问题是我似乎无法在本地调试它。
编辑: 我注意到这个问题也出现在dockerized实例中。似乎有关容器化的问题似乎是问题所在。我什至尝试创建一个包含this guide之后的包的gem,该包在本地工作,但是在查找文件时再次遇到相同的问题,但是这次路径是相对于gem的,而不是我的项目。我仍然对导致此问题的原因感到困惑。
答案 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指向该文件。
粗略地,轮廓如下:
my_library
的整个代码放在应用程序的目录中,例如fixtures
(与Gemfile处于同一级别)。
app/
...
fixtures/
my_library/
ext/
...
lib/
...
my_library.gemspec
Rakefile
Gemfile
my_library
gem:
gem 'my_library', path: 'fixtures/my_library'
Gemfile.lock
bundle update
答案 2 :(得分:0)
正如@ jay-dorsey所提到的,该捆绑确实需要在部署该应用程序的服务器上进行编译才能使用。我遵循的两个创建宝石的指南都有一些误导信息。
ext.lib_dir = "lib/my_library"
而不是ext
目录rake-compiler
开发依赖项.bundle
文件无法在Linux计算机上读取