問題: 更新Ruby2.5.1 與 Rails5.2.0後,執行指令時好時壞


#1

各位好! 小的有問題想求救於大家

小弟最近剛將 ruby 與 rails 更新後,就發生每次新開專案(Appliction / API)就會出現如下圖這個警告訊息。又在執行 rails 指令時(如: rails g controller home index),有時可以正常執行,有時候一個指令等了半個小時還在等,也沒啥錯誤訊息,一定要強制結束掉指令這樣,然後就從強制結束指令後開始該專案就再也執行不了任何的指令了,也有測試過不使用IDE創建專案,但結果還是一樣,不知是否與下圖產生的警告有關。

是否有大大遇到跟我相同的問題,或解決這個問題!
因為我已將 rbenv 移除重灌 3次了,還是一樣有這個問題產生。

問題圖片如下
29

/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:90: warning: already initialized constant FileUtils::VERSION
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:92: warning: previous definition of VERSION was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1188: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1267: warning: previous definition of S_IF_DOOR was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1446: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1541: warning: previous definition of DIRECTORY_TERM was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1448: warning: already initialized constant FileUtils::Entry_::SYSCASE
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1543: warning: previous definition of SYSCASE was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1501: warning: already initialized constant FileUtils::OPT_TABLE
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1596: warning: previous definition of OPT_TABLE was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1555: warning: already initialized constant FileUtils::LOW_METHODS
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1650: warning: previous definition of LOW_METHODS was here
/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1562: warning: already initialized constant FileUtils::METHODS
/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1657: warning: previous definition of METHODS was here

版本
ruby: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
rails: Rails 5.2.0
rbenv: rbenv 1.1.1

rubymine: RubyMine 2018.1.3

mac os: Mac OS 10.13.4


#2

首先,為何你會認為『重灌就能把東西弄好』?還弄了三次左右|||,所以當這個觀點變成否定時,你該做些什麼?

單純猜測 … fileutils 這個東西應該是 stdlib 為何需要裝 gem 然後一直撞到噴?

https://ruby-doc.org/stdlib-2.5.1/libdoc/fileutils/rdoc/FileUtils.html

anyway 把你的 gem 移掉唄 … and 你可以把每個 gem 當作香菇來看,哪些有毒必須實驗過才裝,否則毒素累積過多 … 天知道哪天死掉甚至還突變哩(新舊版本在 github 上隨人改的 … 你是否過度信任了?)

最後,其實我推薦新手用 rvm 就好,至少 gemset 爛了可以直接砍光光重來哩 … 真正部署才去看是否用 rbenv ? ((好啦,我是 rvm 派的,因為我很懶 …


#3

感謝… JC 大大,應該解決了!

原來我的 gem 裡面存在著兩個不用版本 分別是 1.1.0及 1.0.2 如下圖

fileutils (1.1.0, default: 1.0.2)

我刪掉 1.1.0 再重跑就不在出現警告了! 目前 Rails 專案都執行正常!

本以為 版本都升到最新的就應該沒問題,原來 gem 是公開被修改的!

一開始學rails的時候 有試著用 rvm安裝,但可能對它不熟,覺得要設定一堆很麻煩,有多次安裝失敗的經驗,而使用 rbenv 照著文章的流程跑 “點我”,跑完環境就裝好了。

使用 rbenv 裝好在創一個新專案之後,就有一堆套件跑在預設在裡面了!(以為都是官方預設且測試好加進來套件),還沒遇到這問題之前,只要專案能跑,老實說大多都只會注意自已用的到且尚未被安裝進來的套件而已,還真的沒有一個一個去測過那些到底是什麼(還真覺得不好意思…),我再花時間去了解這一塊,感恩~ 感恩~!!!


#4

嘛 … 所以你還是沒搞懂我的意思 … 不需存在 fileutils 這個 gem … 類似你寫的 default: 1.0.2 … 包括內建也都不應該有該 gem 的名稱才是(Gemfile / Gemfile.lock / gem list 內)

anyway 我們 youtube 教學內有解釋 core / stdlib / gem 三個分別才是(第一個影片就是了 …),在 core / stdlib 有的就不需安裝,也不建議安裝,否則你會干擾正常功能唄|||,哪天哪裡噴你都不知道哩|||


#5

耶~! 不好意思 我以為我懂了… ><"

意思是說 fileutils 是在 ruby裝好之後,就有的 lib(它是在放在stdlib 底下),使用 require 就可以使用它,所以不用 gem 再去做安裝它的動作對吧 !
有去檢查過正在跑的幾支專案的 Gemfile / Gemfile.lock 沒有 匯入 fileutils 了,目前專案也能正常執行。

整個專案使用到它的地方是 這支檔案 /bin/setup.rb

#!/usr/bin/env ruby
require 'fileutils'
...

而又查看了 gem list …
它( fileutils default: 1.0.2)是個預設的 gem,這個剛有試過要刪,刪不掉耶!

gem "fileutils" cannot be uninstalled because it is a default gem

另外有個疑問,使用 rbenv 安裝 rails 之後,是不是 rbenv 它會自動幫我預設裝了一些 gem,在想說 fileutils 會有衝突到底是什麼原因造成的,我覺得這問題應該存在很久了… 只是最近會當掉才讓我注意到它…

麻… 好多疑問 @@a,我再去看看您的教學!


#6

嘛 … 看完再來問哩||| 不過我沒玩 rbenv 就是,預設 gem 應該都會有,rvm 也會幫你裝,但我都沒記得會有 fileutils 就是,不過能跑就好了唄,單純提出我的質疑罷了

不過 … A … 糟糕,所以 Ruby 2.5.1 把 fileutils 拉出為 gem 了 … 不然就是列入預設要裝的了

gem list

*** LOCAL GEMS ***

bigdecimal (default: 1.3.4)
bundler-unload (1.0.2)
cmath (default: 1.0.0)
csv (default: 1.0.0)
date (default: 1.0.0)
dbm (default: 1.0.0)
did_you_mean (1.2.0)
etc (default: 1.0.0)
executable-hooks (1.4.2)
fcntl (default: 1.0.0)
fiddle (default: 1.0.0)
fileutils (default: 1.0.2)
gdbm (default: 2.0.0)
gem-wrappers (1.3.2)
io-console (default: 0.4.6)
ipaddr (default: 1.2.0)
json (default: 2.1.0)
minitest (5.10.3)
net-telnet (0.1.1)
openssl (default: 2.1.0)
power_assert (1.1.1)
psych (default: 3.0.2)
rake (12.3.0)
rdoc (default: 6.0.1)
rubygems-bundler (1.4.4)
rvm (1.11.3.9)
scanf (default: 1.0.0)
sdbm (default: 1.0.0)
stringio (default: 0.0.1)
strscan (default: 1.0.0)
test-unit (3.2.7)
webrick (default: 1.4.2)
xmlrpc (0.3.0)
zlib (default: 1.0.0)

所以你應該也刪不掉,這邊我抱歉,沒確認過就回答之類的,寫 default 應該都不用管才是,不過 default 系列可能也不建議更新唄 … 連 bigdecimal / csv 甚至 zlib 都變成 default gem 了 … |||


#7

JC大 沒關係,問題還是解決拉!!

而且這個問題好像找不到較多的文獻,已是困擾我好幾天哩!!
想說再找不到,就等 rbenv 能釋出更新版,看看是否能改善這個問題…
不過問題卡在那邊 連睡覺都睡不安穩… 才想上來問說 我是不是個例…

隨每次 ruby 與 rails 升級,一些 套件被提出或納入… RoR 嘿…不奇怪!
不過話說回來,若系統預設是 1.0.2且不建議升級的話,那麼 在 gem update 就要特別注意了,回想前幾天環境裝好之後,都有執行過 update 的指令,而且在還沒更新版本前…我也時常會 去 update 吶… @@a

這邊 要感謝JC大,不然我根本找不出問題點出在哪裡… ^^"


#8

Gemfile (Rails) 內可以直接強制指定你用的 gem version 才是,且基本上不太更新的,因為天知道對方改了啥,當然重大版本可能要看一下才是


#9

好的,感謝 JC大的提點,我會再多加留意的! :grinning: :grinning: :grinning: