Bundler: คุณกำลังพยายามติดตั้งในโหมดการปรับใช้หลังจากเปลี่ยน Gemfile ของคุณ


86

ฉันค่อนข้างใหม่สำหรับบันเดิลเลอร์และคาปิสตราโนและฉันกำลังพยายามใช้มันร่วมกัน เมื่อฉันพยายามปรับใช้ฉันได้รับข้อความ:

คุณกำลังพยายามติดตั้งในโหมดการปรับใช้หลังจากเปลี่ยน Gemfile ของคุณ เรียกใช้ `` การติดตั้งบันเดิล 'ที่อื่นและเพิ่ม Gemfile.lock ที่อัปเดตลงในการควบคุมเวอร์ชัน

ฉันไม่รู้ว่าจะตอบสนองระบบที่บ่นได้อย่างไรและฉันไม่เข้าใจว่าเหตุใดจึงมีการร้องเรียนเกิดขึ้นเพราะฉันอ่านในเอกสาร :

หากไม่มี Gemfile.lock และคุณได้อัปเดต Gemfile (5) แล้วบันเดิลเลอร์จะใช้การอ้างอิงใน Gemfile.lock สำหรับอัญมณีทั้งหมดที่คุณไม่ได้อัปเดต แต่จะแก้ไขการอ้างอิงของอัญมณีที่คุณอัปเดตใหม่ . คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการอัปเดตนี้ได้ด้านล่างภายใต้ CONSERVATIVE UPDATING

ฉันตีความว่านั่นหมายความว่า Bundler สามารถจัดการกับความจริงที่ว่า Gemfile ของฉันไม่ใช่สิ่งที่คาดหวัง ความช่วยเหลือใด ๆ

ข้อมูลจำเพาะ: Ruby 1.9.3, Rails 3.2.3, Capistrano 2.12.0, Bundler 1.1.4, Windows 7, ปรับใช้กับเครื่อง Posix

แก้ไข: My Gemfile มีบล็อกตรรกะดังต่อไปนี้:

unless RbConfig::CONFIG['host_os'] === 'mingw32'
  # gem 'a' ...
end

คำตอบ:


81

ข้อความแสดงข้อผิดพลาดที่คุณได้รับGemfile.lockอาจเป็นเพราะคุณGemfileและGemfile.lockไม่เห็นด้วยกัน ดูเหมือนว่าคุณได้เปลี่ยนแปลงอะไรบางอย่างใน Gemfile ของคุณตั้งแต่ที่คุณวิ่งครั้งล่าสุดbundle install(หรือupdate) เมื่อคุณbundle installอัปเดต Gemfile.lock ของคุณด้วยการเปลี่ยนแปลงใด ๆ ที่คุณทำกับ Gemfile

ตรวจสอบให้แน่ใจว่าคุณรันbundle installในเครื่องและเช็คอินเพื่อควบคุมแหล่งที่มาเพื่อควบคุมการอัปเดตใหม่ของคุณGemfile.lockหลังจากนั้น จากนั้นลองปรับใช้

แก้ไข : ตามที่ทราบในความคิดเห็นเงื่อนไขใน Gemfile ส่งผลให้ Gemfile.lock ที่ถูกต้องบนแพลตฟอร์มหนึ่งใช้ไม่ได้กับอีกแพลตฟอร์มหนึ่ง ให้แพลตฟอร์มธงอัญมณีขึ้นอยู่กับแพลตฟอร์มเหล่านี้ใน Gemfile ควรแก้ไม่สมส่วน


2
ดูเหมือนจะเป็นคำตอบที่ถูกต้อง แต่ฉันใช้การติดตั้งบันเดิลบนเครื่อง dev ของฉันจากนั้นตรวจสอบทั้ง Gemfile และล็อกเป็น svn จากนั้นใช้ capistrano ปัญหาอาจเป็นเพราะ Gemfile มีบล็อกด้วย: unless RbConfig::CONFIG['host_os'] === 'mingw32'? (เออมันควรจะรวมไอเท็มต่าง ๆ บนคอมพิวเตอร์ที่ใช้ windows ของฉันมากกว่าบนเซิร์ฟเวอร์ linux)
JellicleCat

1
อาจเป็นไปได้ ตรวจสอบเนื้อหาใน Gemfile.lock ของคุณ - มีอัญมณีอ้างอิงที่ควรรวมไว้ใน Windows หรือไม่ หากเป็นเช่นนั้นแสดงว่าบนเครื่องปรับใช้ Gemfile และ Gemfile.lock ต่างกัน (นอกจากนี้ฉันไม่ใช่ผู้เชี่ยวชาญ Bundler แต่ฉันค่อนข้างมั่นใจว่าการวางเงื่อนไขใน Gemfile ไม่ใช่แนวทางปฏิบัติที่ดีที่สุดลองใช้กลุ่มหรือแฟล็ก: แพลตฟอร์ม )
Edd Morgan

2
การใช้:platformsแฟล็กสำหรับอัญมณีที่เซิร์ฟเวอร์ prod (posix) ของฉันต้องการ แต่สิ่งที่ไม่ได้อยู่บนเซิร์ฟเวอร์ dev (win) ของฉันทำให้เกิดความแตกต่าง: platforms :ruby do; gem 'mygem'; ...; end(คุณจะได้รับการตรวจสอบสีเขียวหากคุณไม่ต้องการเพิ่มคำสั่งนี้ในคำตอบของคุณ)
JellicleCat

: แพลตฟอร์มไม่สามารถแยกความแตกต่างระหว่างlinuxและ / หรือdarwin env ที่ใช้:requireงานได้ดีเกินไปstackoverflow.com/a/16475580/933358
Daniël W. Crompton

สิ่งนี้ได้ผลสำหรับฉัน! ขอบคุณช่วยฉันจากวันแห่งความขุ่นมัว!
thenextmogul

26

vi. มัด / config

เปลี่ยนตัวเลือก BUNDLE_FROZEN จาก '1' เป็น '0'

ทำการ "ติดตั้งบันเดิล"


หรือ

เรียกใช้ "bundle config"

ดูว่าค่า "ตรึง" เป็นจริงหรือไม่ให้ตั้งค่าเป็นเท็จ

การกำหนดค่ามัดตรึงเป็นเท็จ


นี่คือสิ่งที่ทำเพื่อฉัน ที่น่าสนใจคือในไฟล์ config นั้นคีย์ BUNDLE_FROZEN ไม่ได้ถูกตั้งค่าเลย ฉันสงสัยว่าเป็นไปได้ไหมที่ฉันตั้ง BUNDLE_FROZEN: 1 ไว้ที่อื่น
Bo G.

bundle config frozen falseคือการแก้ไข goto ของฉัน ขอบคุณมากสองปี! ฉันเชื่อว่าคำตอบของ Joshua Pinter กล่าวถึงความคิดเห็นด้านบนซึ่งอาจเป็นการกำหนดค่า Bundler ทั่วโลกที่ส่งผลกระทบต่อสิ่งนี้
SRack

bundle config frozen falseไม่ได้ทำอะไรให้ฉัน ใช้เพื่อแก้ไข. bundle / config ซึ่งรายการ BUNDLE_FROZEN = "true" (textual true)
Arthur

19

ระวังการกำหนดค่า Bundler ทั่วโลก

ฉันมีการกำหนดค่าส่วนกลางบนสภาพแวดล้อมการพัฒนาของ~/.bundle/configฉันซึ่งฉันไม่มีในสภาพแวดล้อม CI / การผลิตของฉันซึ่งทำให้สิ่งGemfile.lockที่สร้างขึ้นในสภาพแวดล้อม dev ของฉันแตกต่างจากสภาพแวดล้อม CI / การผลิตของฉัน

ในกรณีของฉันฉันตั้งค่าgithub.httpsเป็น true ในสภาพแวดล้อม dev แต่ไม่มีการกำหนดค่าดังกล่าวในสภาพแวดล้อม CI / Production ของฉัน ซึ่งทำให้ทั้งสองGemfile.lockไฟล์แตกต่างกัน


2
ขอบคุณ! จากคำตอบง่ายๆทั้งหมดที่เกี่ยวข้องกับข้อผิดพลาดที่ไร้สาระนี้ - นี่คือสิ่งที่ทำให้ฉันกลับมาทำงานได้ ทำไม Heroku ถึงไม่ช่วยเหลืออัตโนมัติด้วยสิ่งนี้? ช่างเป็นเหตุผลง่อยที่ต้องสูญเสีย 3 ชั่วโมงสุดท้ายในชีวิตของฉัน!
hellion

2
คุณอาจจะช่วยชีวิตฉันได้ ฉันเตรียมพร้อมที่จะยิงตัวเองในเรื่องนี้: P
Tyrone Wilson

1
@JoshuaPinter ใช่นี่ช่วยฉันได้! แม้ว่าจะใช้เวลาหลายชั่วโมงกับมัน ... แต่ฉันพยายามแก้ไขคำเตือนที่ได้รับเมื่อทำการ 'บันเดิลติดตั้ง' และติดอยู่ในดองนี้ ชื่นชมมาก!
daveomcd

1
@daveomcd เคยไปที่นั่นดีใจที่ช่วยให้คุณเกาหัวได้อีกหลายชั่วโมง :)
Joshua Pinter

12

เมื่อคุณเห็นสิ่งต่อไปนี้ ...

$ bundle install
You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the Gemfile freeze
by running `bundle install --no-deployment`.

You have added to the Gemfile:
* source: rubygems repository https://rubygems.org/
* rails (~> 3.2)
. . .

... จากนั้นปัญหามักเกิดจากคุณมีไฟล์. gm ที่ล้าสมัยในไดเร็กทอรีผู้จำหน่าย / แคชของคุณ

บางทีคุณเคยใช้งาน$bundle install --deploymentซึ่งทำให้ไฟล์ .gem "ล้าสมัย" บางไฟล์ในแคช

ไม่ว่าในกรณีใดคุณสามารถผ่านข้อผิดพลาดนี้ได้โดยเรียกใช้: bundle install --no-deployment

นั่นเป็นหนึ่งในสิ่งที่ยอดเยี่ยมมากมายเกี่ยวกับ Rails ... ข้อความแสดงข้อผิดพลาดมักจะบอกคุณว่าต้องทำอย่างไรเพื่อแก้ไขปัญหา


7

ปัญหาเฉพาะของฉันเกี่ยวข้องกับสิ่งที่รายงานโดย @JoshPinter กล่าวคือความคลาดเคลื่อนของโฮสต์ dev-vs-deploy ในโปรโตคอลที่บันเดิลเลอร์ใช้เพื่อดึงอัญมณีจาก github

เพื่อให้เรื่องสั้นสั้นสิ่งที่ฉันต้องแก้ไขคือGemfileรายการต่อไปนี้...

gem 'activeadmin', github: 'activeadmin'

... สำหรับไวยากรณ์ที่ปลอดภัยนี้ ( ดูข้อมูลอ้างอิง ):

gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'

และการปรับใช้ของฉันกลับมาเป็นปกติ


สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้เช่นกัน แปลกจริงๆ.
Joshua Muheim

6

วิธีแก้ปัญหาสำหรับฉันแตกต่างจากที่อื่นเล็กน้อยที่ระบุไว้ที่นี่ ฉันพยายามอัปเกรดจาก sidekiq เป็น sidekiq-pro (ซึ่งต้องใช้บันเดิลเลอร์ 1.7.12+) แต่ฉันยังคงได้รับข้อความ "คุณกำลังพยายามติดตั้งในโหมดการปรับใช้หลังจากเปลี่ยน Gemfile" ของคุณจาก travis-ci

การตรวจสอบเอาต์พุตคอนโซลของ travis-ci พบว่ามีการใช้บันเดิลเลอร์เวอร์ชันเก่ากว่า

ในกรณีของฉันฉันต้องแก้ไขไฟล์ travis.yml เพื่อเพิ่ม:

before_install: - gem update bundler

สิ่งนี้บังคับให้ travis-ci ใช้บันเดิลเลอร์เวอร์ชันล่าสุดและทำให้ข้อความแสดงข้อผิดพลาดหายไป


สิ่งนี้ได้ผลสำหรับฉันภายใต้ Capistrano เพื่อเรียกใช้cap shellและgem update bundlerหรือwith <role> gem update bundlerหรือon <machine> gem update bundler
Eric



2

สาเหตุอื่นของข้อผิดพลาด:

นี่เป็นเรื่องที่โง่เขลาเล็กน้อย แต่ฉันแน่ใจว่ามีคนทำผิดแบบเดียวกันนี้

สำหรับ Rails 4 Heroku ได้เพิ่ม gem rail_12factor หากคุณใช้งานก่อนที่จะเพิ่มเข้าไปคุณจะมีอัญมณีทั้งสองนี้:

gem 'rails_log_stdout',  github: 'heroku/rails_log_stdout'
gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'

คุณต้องลบออกเมื่อคุณเพิ่มใหม่ (รวมอยู่ด้วย) ฉันคิดว่าคุณสามารถหลีกเลี่ยงมันได้จนกว่าคุณจะแตะเส้นเหล่านั้นในไฟล์อัญมณีของคุณจากนั้น Heroku จะสังเกตเห็นการทำซ้ำและร้องไห้ออกมาพร้อมกับข้อผิดพลาดข้างต้น

ขอให้โชคดีกับ Rails 4.


1

ฉันเคยเจอสิ่งที่คล้ายกันมาก่อน วิธีหนึ่งในการแก้ไขฉันคิดว่า แต่อาจใช้พื้นที่บนเซิร์ฟเวอร์มากกว่าที่คุณต้องการคือการเรียกใช้

bundle install --deployment 

แล้วลองปรับใช้ สิ่งนี้ทำบางอย่างเช่นติดตั้งอัญมณีทั้งหมดของคุณลงในโฟลเดอร์ผู้ขายซึ่งฉันเชื่อว่าโดยทั่วไปแล้วเป็นสิ่งที่ดีที่จะหลีกเลี่ยง ... แอปของฉันเคยทำงานเช่นนี้วิธีแก้ปัญหาของฉันคือการลบเวอร์ชันที่แน่นอนเพื่อดาวน์โหลดจากใน Gemfile ของฉันจากนั้นทำการรวมกลุ่มใหม่และปรับใช้

gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'

ถึง

gem 'rails_admin'

หรือคุณสามารถทำตามที่แนะนำและ Git โปรเจ็กต์ของคุณจากเซิร์ฟเวอร์ที่ใช้งานจริงไปยังเครื่องโลคัลรวมกลุ่มแล้วส่งกลับไปยังเซิร์ฟเวอร์ของคุณ วิธีนี้อาจไม่ถูกต้อง 100% แต่บางวิธีก็ใช้ได้ผลสำหรับฉัน ... แค่คิดว่าฉันจะแบ่งปัน โชคดี


1
--deploymentธงไม่ได้สร้างความแตกต่างถ้าฉันลบ Gemfile.lock นั่นคือสิ่งที่ควรจะเป็น?
JellicleCat

1

ในกรณีของเราเรากำลังใช้คุณลักษณะที่ไม่มีในบันเดิลเลอร์เวอร์ชันเก่าซึ่งทำงานบนเครื่องผลิตของเรา ดังนั้นการอัพเกรดบันเดิลเลอร์ก็เพียงพอแล้วเช่นทำไฟล์gem update bundler.


ขอบคุณ - ฉันมีปัญหานี้เช่นกัน ปรากฎว่าเวอร์ชันของบันเดิลเลอร์บนเซิร์ฟเวอร์เก่ากว่าเวอร์ชันที่เราใช้บนเดสก์ท็อป
Nathan Bertram

1

นี่อาจเป็นแนวคิดที่อันตราย แต่หากต้องทดสอบบางอย่างในสภาพแวดล้อมการปรับใช้งานจริงคุณสามารถแก้ไขไฟล์. bundle / config

# This value is normally '1' 
# Set it to '0'
BUNDLE_FROZEN: '0'

ตอนนี้เรียกใช้บันเดิลในกรณีของฉันฉันต้องการอัปเดตอัญมณีเฉพาะดังนั้นนี่คือคำสั่งของฉัน

RAILS_ENV=production bundle update <whatever gem>

คุณควรเปลี่ยนกลับหลังจากการอัปเดตดังนั้นสิ่งต่างๆจะเป็นไปอย่างที่คุณคาดหวังในภายหลัง อีกครั้งอาจไม่ได้รับการสนับสนุนและ YMMV


0

ฉันพบสิ่งนี้ในการปรับใช้แอป Nesta หลังจากการอัปเดตอัญมณีบางอย่าง สิ่งที่ได้ผลสำหรับฉันคือการลบ Gemfile.lockเรียกใช้bundle installเพื่อสร้างใหม่และปรับใช้อีกครั้ง


0

ฉันวิ่งเข้าไปในปัญหาที่คล้ายกัน แต่ฉันไม่ได้ทำทั้งสองbundle installและbundle updateและ Heroku ยังคงปฏิเสธการผลักดันของฉัน

ฉันแก้ไขปัญหาโดยการลบ Gemfile.lock แล้วเรียกใช้bundle installอีกครั้ง จากนั้นฉันก็เพิ่มมุ่งมั่นและผลักดันสิ่งนั้นไปยัง git repo ของฉัน หลังจากนั้นฉันก็ไม่มีปัญหาในการผลักไปที่ Heroku


หากคุณไม่ได้แก้ไขเวอร์ชันอัญมณีใน gemfile ของคุณสิ่งนี้มีความเสี่ยง .. มันอาจอัปเดตอัญมณีและทำลายแอปของคุณ
Abram

0

สำหรับ heroku คุณไม่จำเป็นต้องเปลี่ยนไวยากรณ์ในไฟล์Gemfile. คุณสามารถเพิ่มBUNDLE_GITHUB__HTTPS(สังเกตขีดล่างคู่) เป็นตัวแปรสภาพแวดล้อมและตั้งค่าเป็นtrue(ในแดชบอร์ดของแอป heroku ใต้Settingsแท็บในConfig Varsส่วน) สิ่งนี้จะเปลี่ยนโปรโตคอลจากgit://เป็นhttps://สำหรับคำขอดังกล่าวทั้งหมด


0

ฉันได้รับข้อความแสดงข้อผิดพลาดเมื่อพยายามกดไปที่ Heroku ฉันพบวิธีแก้ไขปัญหาต่อไปนี้แล้ว

  1. Git ดึงต้นแบบต้นทาง
  2. สถานะ Git
  3. คอมมิต Git
  4. Git push origin master
  5. Git push heroku master

0

ปัญหานี้อาจเกี่ยวข้องกับโมดูลย่อยที่ชี้ไปยังโค้ดเวอร์ชันเก่า สำหรับฉันฉันแก้ไขปัญหานี้โดยการอัปเดตโมดูลย่อยของฉัน

หากคุณมีโมดูลย่อยให้ลองเรียกใช้:

git submodule update --init

bundle install



0

ฉันอ่านวิธีแก้ปัญหามากมายเกี่ยวกับแหล่งข้อมูลต่างๆ แต่ไม่พบว่าอะไรจะช่วยฉันได้ในสถานการณ์นี้

ดังนั้นฉันจึงหาวิธีแก้ปัญหา ตรงบอกว่าผมอ่านข้อความข้อผิดพลาดอย่างตั้งใจและมีลำพัง: Run มัดติดตั้งที่อื่น "ที่อื่น" คือ Cloud9 ที่ฉันพัฒนาแอป ขั้นตอนของฉัน

  1. คัดลอก Gemfile และ Gemfile.lock จากเซิร์ฟเวอร์ไปยังเครื่องภายในด้วยrsyncคำสั่ง
  2. แทรกสองไฟล์นี้ลงในโปรเจ็กต์ RoR ของฉัน (ฉันใช้ Cloud9)
  3. เปิด Gemfile และทำการเปลี่ยนแปลงตามที่ฉันต้องการ ในกรณีของฉันฉันเพิ่มอัญมณี 'บาง'
  4. ในซีดี terminal เพื่อ app ของฉันใน Cloud9 bundle installและเรียกใช้ ในกรณีนี้คุณจะมีGemfile.lock เวอร์ชันที่เปลี่ยนแปลงไป
  5. คัดลอกGemfile และ Gemfile.lock ใหม่บนเซิร์ฟเวอร์โดยใช้rsync
  6. cd ไปยังโฟลเดอร์แอพของฉันแล้วเรียกใช้bundle install --deployment --without development test DONE อีกครั้ง ! ขอให้ทุกคนโชคดี!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.