Проблеми Ruby on Rails та Rake: неініціалізована константа Rake :: DSL


189

У мене справді страхітливе питання: Граблі глуміють.

Ось як виникає проблема:

$ rails new test_app
$ rails generate scaffold new_scaffold field1:string field2:text

Обидва працюють просто чудово, але тоді, коли я це роблю,

$ rake db:migrate

Я отримую таку помилку.

(in /home/mikhail/test_app)
rake aborted!
uninitialized constant Rake::DSL
/usr/lib/ruby/1.9.1/rake.rb:2482:in `const_missing'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:6:in `<module:Rake>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:3:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `require'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `load'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `block in <top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `each'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `initialize_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:139:in `load_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:77:in `method_missing'
/home/mikhail/test_app/Rakefile:7:in `<top (required)>'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/bin/rake:31:in `<main>'

Я шукав в Інтернеті подібні / ті ж помилки, і люди їх мали. Просто, здається, ніхто ніколи не вирішує проблему!

Як виправити цю проблему?

Відповіді:


193

Твіт від DHH раніше. Rake .9.0 розбиває Rails та кілька інших речей, вам потрібно:

gem "rake", "0.8.7"

у вашому Gemfile.


17
Це працювало для мене. Мені потрібно було зробити bundle update rakeспочатку. Потім я перевірив bundle show rake. Слід сказати 0.8.7. Потім rake db:migrate.
B Сімень

26
Або ще краще: gem "rake", "!= 0.9.0". Це дозволяє уникнути зламаного версії 0.9.0, але оновиться до новішого після опублікування більш свіжого випуску (видалення цього пізніше не зашкодить, але збереження його також не зашкодить).
Спіраліс

6
@Spiralis Я також зіткнувся з проблемою з версією 0.9.2. Тому вам, можливо, доведеться додати цей рядок для кількох версій.
dharmatech

3
це рішення спрацювало для мене. Як і @dharmatech, у мене з’явилася ця проблема, heroku rake db:migrateі це, здавалося, вирішило її. не забудьте додати ці зміни до git, перш ніж продовжувати;)
pruett

1
Це може працювати для Rails, але я також повинен був sudo gem install rakeзробити так, щоб rakeверсія, яку я викликав з командного рядка, не була 0.8.7.
Осіннє осінь,

72

Я зробив деякі дослідження відразу після своєї попередньої відповіді (вибачте, я повинен зробити до цього).

Всі проблеми вирішено з Rake gem 0.9.2 .. Я дотримувався цих кроків:

  • Я встановив gem install rake -v=0.9.2(у мене був 0,9.1 дорогоцінний камінь)
  • видалено 0.9.1 с gem uninstall rake -v=0.9.1
  • оновлено с bundle update
  • то db:migrateпоказав попередження,WARNING: Global access to Rake DSL methods is deprecated. Please....

    Це було вирішено шляхом додавання наступного до файлу Rake.

    module ::YourApplicationName  
      class Application
        include Rake::DSL
      end
    end
    
  • Я заборонив module ::RakeFileUtils extend Rake::FileUtilsExtendваріант, який було застосовано @databyte.

Це означає, що дорогоцінний камінь Rake 0.9.2 працює чудово!


Виконав перші три кроки, і я не отримав попередження, тому не турбував решту, Дякую за пропозицію!
Abe Petrillo

1
Це запитує мене запитати ... Чому я повинен зламати Rake, щоб зберегти цю функцію? Що намагається зробити Rake, і що мені зараз використовувати?
Ryanmt

@Arrumaco, що таке каталог файлу Rake?
Ctak

Варто зауважити, що доповнення до цього RakeFileмає бути раніше require 'rake'- зловив мене :)
Ciaran Archer

12
те саме питання, але у мене вже були граблі (0.9.2, 0.8.7). Повторна установка 0.9.2, здається, усуває проблему: 1) gem uninstall rake -v=0.9.22)gem install rake -v=0.9.2
DK.

54

Переглянувши розділ 2 Railstutorial (demo_app) і зіткнувшись з цією проблемою. Я спробував усі інші перелічені тут відповіді, але не зміг змусити його працювати, поки я цього не зробив:

Помістіть це у своєму Rakefile вище, вимагайте "рейку":

require 'rake/dsl_definition'

через Як виправити неініціалізовану постійну проблему Rake :: DSL на Heroku?

Я також повторно пересилав усі файли до Github та Heroku.


Це здається найкращою відповіддю, оскільки пониження рівня з 0,9,2 до 0,8,7 призведе до порушення деяких коштовних залежностей залежно від кожного випадку, наприклад, мого :)
DiegoSalazar

Це не працює для мене. Я отримую "не завантажувати такого файлу - rake / dsl_definition" під час виконання рейку db: create
KMC

25

Все, що мені потрібно було зробити - це використовувати:

gem install rake

У мене вже була версія 0.9.2, просто потрібна інсталяція.


вау, це працювало на мене. Але ви могли б пояснити, чому я повинен встановлювати рейку, коли я грабля вже повинен бути там?
KMC

Я все ще не є експертом, але я розумію, що існує різниця між "встановленням" дорогоцінних каменів на ваш комп'ютер і "встановленням" їх у реєстрі дорогоцінних каменів - я підозрюю, що це відбувається тому, що для установки Ruby потрібно знати, які саме дорогоцінні камені де на вашому ПК. Можливо, це те, що може бути автоматизовано в майбутньому або вже автоматизовано в певних дистрибутивах Ruby ...
Branstar

19

Перевстановіть дорогоцінний камінь, і він повинен добре працювати:

gem uninstall rake -v=0.9.2 
gem install rake -v=0.9.2

Якщо ні, вкажіть версію "0.8.7" у своєму Gemfile.


такий підхід працював на мене, і я вважав за краще не знижувати версію ..
Тарншаф

Працював і для мене, тільки для граблів -v 0.9.2.2
Haspemulator

10

Якщо не використовується Bundler:

sudo gem install rake -v 0.8.7
sudo gem uninstall rake

Потім виберіть видалення 0.9.0.


це зафіксувало це для мене без пакувальника (рейки 2.3.8). Спробував встановити рейку 0.9.2, але це не виправило. Нарешті для мене вдалося встановити 0.8.7 та видалити 0.9.2.
Майкл Дюрант

8

Якщо ви, як я, ви застрягли на рейках 0.8.7 і використовуєте Rails 3.2.x, то залізниці додають вимогу до Rake :: DSL

Щоб вирішити це, на початок вашого Rakefile слід додати:

module Rake
  module DSL
  end
end

7

Я вирішив ту ж проблему, виконавши наступні кроки:

У Gemfile:

gem 'rake', '0.9.2'

Потім запустив це на консоль:

sudo bundle update rake

Потім додали наступні рядки до Rakefile:

require 'rake/dsl_definition'
include Rake::DSL

6

Рейки 3.1.rc1 оновлено. Для власних Rakefiles ви можете додати це перед викликом до load_tasks.

module ::YourApplicationName
  class Application
    include Rake::DSL
  end
end

module ::RakeFileUtils
  extend Rake::FileUtilsExt
end

https://gist.github.com/4cd2bbe68f98f2f0249f

ОНОВЛЕННЯ: Також помічено, що тут уже відповіли: Невизначений метод 'завдання' за допомогою Rake 0.9.0


4

У мене була така ж проблема, і мені довелося використовувати граблі 0.8.7 gem замість 0.9.0.


4

Я користувач Windows XP, і у мене була така ж проблема.

Я ввів gem "rake", "0.8.7" у gemfile, а потім набрав у вікні команди наступне.

bundle update rake

Це вирішило мою проблему.


працював і на мене, як і сьогодні. просто намагаюся кодувати рейки на Win7.
arscariosus

4
  1. Перейдіть до свого проекту
  2. Тип bundle install --path=vendor/bundle
  3. Тип bundle exec rake db:migrate

Для запуску типу сервера bundle exec rails s. Використовуйте bueck exec, і ви будете впевнені, що використовуєте правильні дорогоцінні камені (необхідна версія) для свого проекту. Крім того, я б порекомендував вам додати vendor/bundleв , .gitignoreякщо ви використовуєте gitі зробити псевдонім bundle exec. Якщо ви використовуєте, zshви можете дотримуватися такого підходу


3

Те саме, що Branstar вище - дякую Branstar!

  • ОС: Windows Vista
  • Рівень: абсолютно новий у Ruby on Rails
  • У мене вже був встановлений Ruby 1.9.2

Я дотримувався вказівок із запуском Rails 3 для Windows .

Всі працювали до тих пір, поки не почалася частина "rake db: migrate", яка дала мені такий же вихід, як і оригінальний пост.

Я побіг:

gem install rake

Я знову побіг:

rake db:migrate

Тоді я зміг запустити сервер Ruby on Rails і мав все на своєму місці.

Ще раз дякую Branstar :-)


2

Я відчуваю вас (mikhailvs), це насправді засмучує. Я божеволіла майже один повний день. Я навіть видалив Ruby та всі його залежні файли та вимкнув комп'ютер, але у мене все-таки виникла та сама проблема.

Що я отримав з повідомлення про помилку, це проблема з Rake 0.9.2. Здається, він не був повністю встановлений. Тому мені довелося перевстановитиgem install rake -v=0.9.2

Я не був впевнений, чи встановлено граблі - v0.9.1. Тому, щоб переконатися, що я в безпеці, я спробував видалити цю стару версію gem uninstall rake -v=0.9.1. Але мені показали повідомлення про помилку

ERROR:  While executing gem ... (Gem::InstallError)
    cannot uninstall, check `gem list -d rake`

Гаразд, тому я перевірив усі довідники Rake на своєму ПК та виявив, що у мене є лише Rake 0.9.2. Потім, щоб перевірити, чи все нормально, я мігрував rake db:migrate. І це спрацювало :)

Я думаю, що у мене не було Rake 0.9.1, оскільки я очистив інстальований Ruby ( rubyinstaller-1.9.2-p180 - в моїй системі Windows 7) і всі дорогоцінні камені. Тим часом Rake 0.9.2 не був повністю встановлений.


2

Видалення за допомогою "gem uninstall rake" працювало для мене, у мене було встановлено 2 версії, тому я жартома зробив чисту перевстановку.

"rake db: create" , щоб переконатися, що база даних існує, а потім "rake db: migrate", щоб закріпити угоду.


2

У мене була така ж проблема, використовуючи Rake 0.9.2.2. Я вирішив цю проблему, використовуючи exec bundle.



0

Встановіть рейку 0.8.7 та видаліть 0.9.2.2

$ gem install rake -v 0.8.7
$ gem uninstall rake -v 0.9.2.2

Тепер використовуйте

$ bundle exec rake db:migrate

я думаю, що це допоможе тобі;)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.