Gem installation problem.
-
+1 for reproducing this problem in the wild.
-
@neluser I have pushed out update to 4.2.2. But I don't think the redmine version upgrade will fix the gem installation problem. I made some progress today with trying to figure how to get gems to install out of the plugin directory that redmine can also use. I will continue the work tomorrow.
-
@girish Hello, unfortunately the update did not bring any improvements.
If this information helps, then the latest version on which the gems worked properly is, "Package Version org.redmine.coudronapp@1.6.2 ".
I have suspicions. that the problem might be with the Ruby version.
Because the latest working version of Redmine is installed with the Ruby version: "ruby 2.5.1". And the problems with gems started with the version: "ruby 2.7.0" -
-
@girish Hello! Are there improvements in the bug fixes?
The Redmine website states that Ruby 2.7 is not supported. Need to use Ruby 2.7.2 or higher.
(Redmine 4.2 does not support Ruby 2.7.0 and 2.7.1. Use Ruby 2.7.2 or higher )
https://www.redmine.org/projects/redmine/wiki/RedmineInstall#fn1 -
@neluser you are right, the current app docker is not correct and should be updated to use rvm to install a more recent ruby. Looks like ubuntu 20 has ruby 2.7.0 out of the box.
root@6fb7aad07e35:/# ruby2.7 --version ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
I pushed the update to 4.2.3 already, I am updating it to use rvm now.
-
@neluser I have fixed the ruby version issue now. On to the gem installation issue. I get the same error as you:
root@e6152e31-acac-4353-a1c4-8ceab636eed8:/app/code# bundle exec rake redmine:plugins RAILS_ENV=production Could not find gem 'redmine_crm' in locally installed gems. Run `bundle install` to install missing gems. root@e6152e31-acac-4353-a1c4-8ceab636eed8:/app/code# bundle exec rake redmine:plugins NAME=redmine_contacts RAILS_ENV=production Could not find gem 'redmine_crm' in locally installed gems. Run `bundle install` to install missing gems.
-
OK, I think I figured this one out.
Just leaving my notes here, since I will surely need this few months from now
RubyGems
RubyGems is the package manager and the names of packages is gems. RubyGems is part of ruby since 1.9. The
gem
CLI lets one install gems.list
,info
,search
install
are common subcommands.By default,
gem install
requires sudo since into installs into system location/var/lib/gems/2.7.0
. It will also install deps of the gem. App canrequire
these gems in code.Bundler
Bundle(r) allows an app to specify a Gemfile that lists the gems and it's versions.
bundle install
will install the gems into the same system wide location.bundle exec command
runs the executable command in context of the bundle. Meaning, it will ensure that the app does not use any gems not listed in the bundle and also ensure that the gems it is using are compatible with the versions in the Gemfile.bundler creates
Gemfile.lock
with "resolved" versions. This has to be writable file even at runtime.Gem install
-
gem
-GEM_HOME
defines where gems are installed.GEM_PATH
is list of search locations for gems. This is at the kernel level. Default value of these variables can be got fromgem env gemhome
andgem env gempath
.GEM_HOME
is implicitly included intoGEM_PATH
. -
bundler
- by default, it's tuned for development and usesgem
defaults underneath. This means everything is installing into system locations.bundler
has adeployment
mode which is a shortcut for installing intovendor/bundle
subdirectory (--local
will write to<project_root>/.bundle/config
and --global will write to~/.bundle/config
). When you callbundle install --deployment
first time, it stashes this path info into.bundle/config
and all subsequent calls follow this "deployment" mode. In deployment mode, gems will only get loaded from the vendor directory and nowhere else. (As an aside,BUNDLE_PATH
env var can be set to tell bundler where to install and locate gems).
Gem loading
Ruby kernel is just loading gems based on
LOAD_PATH
variable.bundle exec
is essentially overloadingrequire
calls. It readsGemfile.lock
, patchingLOAD_PATH
to have paths of the gems and then calling the original kernelrequire
. -