ฤดูใบไม้ผลิ MVC เป็นเฟรมเวิร์ก Java ที่ใช้ในการสร้างเว็บแอปพลิเคชัน มันเป็นไปตามรูปแบบการออกแบบแบบจำลองมุมมอง-คอนโทรลเลอร์สปริง MVC เป็นโซลูชั่นที่หรูหราในการใช้ MVC ในกรอบฤดูใบไม้ผลิโดยความช่วยเหลือของ Dispatcherservlet
@NANNOTATIONSS
ฤดูใบไม้ผลิเป็นแอปพลิเคชัน Rails Preloader มันเพิ่มความเร็วในการพัฒนาโดยทำให้แอปพลิเคชันของคุณทำงานในพื้นหลังดังนั้นคุณไม่จำเป็นต้องบูตทุกครั้งที่คุณทำการทดสอบงานเรคหรือการย้ายถิ่น
rails new เพื่อสร้างแอปพลิเคชันของคุณ) ฤดูใบไม้ผลิใช้ประโยชน์อย่างกว้างขวางของ Process.fork ดังนั้นจะไม่สามารถให้ความเร็วสูงบนแพลตฟอร์มที่ไม่รองรับการฟอร์ค (Windows, JRuby)
เพิ่มสปริงลงใน Gemfile ของคุณ:
gem "spring" , group : :development (หมายเหตุ: การใช้ gem "spring", git: "..." ไม่ ทำงานและไม่ได้รับการสนับสนุนในการใช้สปริง)
ขอแนะนำให้ 'สปริง' ผู้บริหารใน bin/ ไดเรกทอรีของคุณ:
$ bundle install
$ bundle exec spring binstub --all
สิ่งนี้จะสร้างการปฏิบัติการ bin/spring และแทรกโค้ดขนาดเล็กลงในไฟล์ปฏิบัติการที่มีอยู่ที่เกี่ยวข้อง ตัวอย่างดูเหมือนว่า:
begin
load File . expand_path ( '../spring' , __FILE__ )
rescue LoadError
endบนแพลตฟอร์มที่มีการติดตั้งและรองรับสปริงข้อมูลตะขอนี้สปริงเข้าสู่การดำเนินการของคำสั่ง ในกรณีอื่น ๆ ตัวอย่างจะถูกละเว้นอย่างเงียบ ๆ และบรรทัดหลังจากที่มันจะถูกดำเนินการตามปกติ
หากคุณไม่ต้องการนำหน้าคำสั่งทุกคำสั่งที่คุณพิมพ์ด้วย bin/ คุณสามารถใช้ direnv เพื่อเพิ่ม ./bin PATH โดยอัตโนมัติเมื่อคุณ cd เข้าสู่แอปพลิเคชันของคุณ เพียงสร้างไฟล์ .envrc ด้วยคำสั่ง PATH_add bin ในไดเรกทอรี Rails ของคุณ
สำหรับคำแนะนำนี้ฉันได้สร้างแอปพลิเคชั่น Rails ใหม่และเรียกใช้ rails generate scaffold post name:string
มาทดสอบกันเถอะ:
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 2734
Run options:
# Running tests:
.......
Finished tests in 0.127245s, 55.0121 tests/s, 78.5887 assertions/s.
7 tests, 10 assertions, 0 failures, 0 errors, 0 skips
real 0m2.165s
user 0m0.281s
sys 0m0.066s
นั่นไม่ได้เร็วเป็นพิเศษเพราะเป็นการวิ่งครั้งแรกดังนั้นฤดูใบไม้ผลิจึงต้องบูตแอปพลิเคชัน ตอนนี้กำลังทำงานอยู่:
$ bin/spring status
Spring is running:
26150 spring server | spring-demo-app | started 3 secs ago
26155 spring app | spring-demo-app | started 3 secs ago | test mode
การวิ่งครั้งต่อไปจะเร็วขึ้น:
$ time bin/rake test test/controllers/posts_controller_test.rb
Running via Spring preloader in process 8352
Run options:
If we edit any of the application files, or test files, the changes will
be picked up on the next run without the background process having to
restart. This works in exactly the same way as the code reloading
which allows you to refresh your browser and instantly see changes during
development.
But if we edit any of the files which were used to start the application
(configs, initializers, your gemfile), the application needs to be fully
restarted. This happens automatically.
Let's "edit" `config/application.rb`:
$ touch config/application.rb $ bin/Spring Spring กำลังทำงานอยู่:
26150 สปริงเซิร์ฟเวอร์ | Spring-Demo-App เริ่มต้น 36 วินาทีที่ผ่านมา 26556 แอพฤดูใบไม้ผลิ | Spring-Demo-App เริ่ม 1 วินาทีที่ผ่านมา | โหมดทดสอบ
The application detected that `config/application.rb` changed and
automatically restarted itself.
If we run a command that uses a different environment, then that
environment gets booted up:
$ bin /rake เส้นทางที่ทำงานผ่าน preloader ฤดูใบไม้ผลิในกระบวนการ 2363 โพสต์ get /posts(. : format) โพสต์#ดัชนีโพสต์ /โพสต์ (:: ฟอร์แมต) โพสต์#สร้าง new_post get /posts/new(.: format) โพสต์#new edit_post get /posts /posts/:id(.: format) โพสต์#อัปเดตลบ /posts/:id(.: format) โพสต์#ทำลาย
$ bin/Spring Status Spring กำลังทำงานอยู่:
26150 สปริงเซิร์ฟเวอร์ | Spring-Demo-App เริ่ม 1 นาทีที่ผ่านมา 26556 แอพฤดูใบไม้ผลิ | Spring-Demo-App เริ่ม 42 วินาทีที่ผ่านมา | โหมดทดสอบ 26707 แอพ Spring | Spring-Demo-App เริ่ม 2 วินาทีที่ผ่านมา | โหมดการพัฒนา
There's no need to "shut down" Spring. This will happen automatically
when you close your terminal. However if you do want to do a manual shut
down, use the `stop` command:
$ bin/ฤดูใบไม้ผลิหยุดฤดูใบไม้ผลิหยุด
From within your code, you can check whether Spring is active with `if defined?(Spring)`.
### Removal
To remove Spring:
* 'Unspring' your bin/ executables: `bin/spring binstub --remove --all`
* Remove spring from your Gemfile
### Deployment
You must not install Spring on your production environment. To prevent it from
being installed, provide the `--without development test` argument to the
`bundle install` command which is used to install gems on your production
machines:
การติดตั้ง $ Bundle -ไม่มีการทดสอบการพัฒนา
## Commands
### `rake`
Runs a rake task. Rake tasks run in the `development` environment by
default. You can change this on the fly by using the `RAILS_ENV`
environment variable. The environment is also configurable with the
`Spring::Commands::Rake.environment_matchers` hash. This has sensible
defaults, but if you need to match a specific task to a specific
environment, you'd do it like this:
``` ruby
Spring::Commands::Rake.environment_matchers["perf_test"] = "test"
Spring::Commands::Rake.environment_matchers[/^perf/] = "test"
# To change the environment when you run `rake` with no arguments
Spring::Commands::Rake.environment_matchers[:default] = "development"
rails console rails generate rails runner สิ่งเหล่านี้ดำเนินการตามคำสั่งของ Rails ที่คุณรู้จักและชื่นชอบ หากคุณเรียกใช้คำสั่งย่อยที่แตกต่างกัน (เช่น rails server ) สปริงจะส่งผ่านไปยัง rails ที่เรียกใช้งานได้โดยอัตโนมัติ (โดยไม่ต้องเร่งความเร็ว)
คุณสามารถเพิ่มสิ่งเหล่านี้ลงใน Gemfile ของคุณสำหรับคำสั่งเพิ่มเติม:
Test::Unit บนราง 3 เนื่องจากมีเพียง Rails 4 เท่านั้นที่อนุญาตให้คุณใช้ rake test path/to/test เพื่อเรียกใช้การทดสอบ/ไดเรกทอรีเฉพาะหากคุณไม่ต้องการให้มีการตรวจสอบรหัสที่เกี่ยวข้องกับสปริงลงในที่เก็บต้นทางของคุณคุณสามารถใช้สปริงได้โดยไม่ต้องเพิ่มลงใน Gemfile ของคุณ อย่างไรก็ตามการใช้ Spring Binstubs โดยไม่ต้องเพิ่มสปริงลงใน Gemfile
หากต้องการใช้สปริงเช่นนี้ให้ gem install spring แล้วคำสั่งนำหน้าด้วย spring ตัวอย่างเช่นแทนที่จะเรียกใช้ bin/rake -T คุณจะเรียกใช้ spring rake -T
หากคุณใช้ Spring Binstubs แต่ไม่ต้องการให้คำสั่งทำงานผ่านฤดูใบไม้ผลิให้ตั้งค่าตัวแปรสภาพแวดล้อม DISABLE_SPRING
สปริงใช้กลไกการโหลดคลาสของ Rails '( ActiveSupport::Dependencies ) เพื่อให้รหัสของคุณทันสมัยระหว่างการทดสอบ นี่เป็นกลไกเดียวกันที่ช่วยให้คุณเห็นการเปลี่ยนแปลงระหว่างการพัฒนาเมื่อคุณรีเฟรชหน้า อย่างไรก็ตามคุณอาจไม่เคยใช้กลไกนี้กับสภาพแวดล้อม test ของคุณมาก่อนและอาจทำให้เกิดปัญหาได้
สิ่งสำคัญคือต้องตระหนักว่าการโหลดรหัสใหม่หมายความว่าค่าคงที่ในแอปพลิเคชันของคุณเป็น วัตถุที่แตกต่างกัน หลังจากไฟล์มีการเปลี่ยนแปลง:
$ bin/rails runner 'puts User.object_id'
70127987886040
$ touch app/models/user.rb
$ bin/rails runner 'puts User.object_id'
70127976764620
สมมติว่าคุณมี initializer config/initializers/save_user_class.rb เช่น So:
USER_CLASS = User สิ่งนี้จะช่วยประหยัดรุ่น แรก ของคลาส User ซึ่งจะไม่เป็นวัตถุเดียวกับ User หลังจากที่รหัสได้รับการโหลดซ้ำ:
$ bin/rails runner 'puts User == USER_CLASS'
true
$ touch app/models/user.rb
$ bin/rails runner 'puts User == USER_CLASS'
false
ดังนั้นเพื่อหลีกเลี่ยงปัญหานี้อย่าบันทึกการอ้างอิงไปยังค่าคงที่แอปพลิเคชันในรหัสการเริ่มต้นของคุณ
ณ ฤดูใบไม้ผลิ 1.7 มีการสนับสนุนบางอย่างสำหรับการทำสิ่งนี้ ดูตัวอย่างที่เก็บข้อมูลสำหรับข้อมูลเกี่ยวกับวิธีการทำกับ Docker
ฤดูใบไม้ผลิจะอ่าน ~/.spring.rb และ config/spring.rb สำหรับการตั้งค่าที่กำหนดเอง โปรดทราบว่า ~/.spring.rb ถูกโหลด ก่อน Bundler แต่ config/spring.rb ถูกโหลด หลังจาก Bundler ดังนั้นหากคุณมีการติดตั้ง spring-commands-* อัญมณีที่คุณต้องการให้พร้อมใช้งานในทุกโครงการโดยไม่ต้องเพิ่มลงใน Gemfile ของโครงการต้องการพวกเขาใน ~/.spring.rb ของคุณ
config/spring_client.rb ถูกโหลดก่อนที่ Bundler และก่อนที่กระบวนการเซิร์ฟเวอร์จะเริ่มต้นขึ้นก็สามารถใช้เพื่อเพิ่มคำสั่งระดับบนสุดใหม่
ฤดูใบไม้ผลิต้องรู้วิธีค้นหาแอปพลิเคชันรางของคุณ หากคุณมีแอพปกติทุกอย่างทำงานนอกกรอบ หากคุณกำลังทำงานในโครงการที่มีการตั้งค่าพิเศษ (ตัวอย่างเช่นเอ็นจิ้น) คุณต้องบอกสปริงว่าแอปของคุณอยู่ที่ไหน:
Spring . application_root = './test/dummy' ไม่มี Spring.before_fork การโทรกลับ ในการเรียกใช้บางอย่างก่อนส้อมคุณสามารถวางไว้ใน ~/.spring.rb หรือ config/spring.rb หรือในไฟล์ใด ๆ ที่เรียกใช้เมื่อแอปพลิเคชันของคุณเริ่มต้นเช่น config/application.rb , config/environments/*.rb หรือ config/initializers/*.rb
คุณอาจต้องการเรียกใช้รหัสหลังจากสปริงสปริงออกจากกระบวนการ แต่ก่อนที่คำสั่งจริงจะเรียกใช้ คุณอาจต้องการใช้การโทรกลับ after_fork หากคุณต้องเชื่อมต่อกับบริการภายนอกทำการล้างข้อมูลทั่วไปหรือตั้งค่าการกำหนดค่าแบบไดนามิก
Spring . after_fork do
# run arbitrary code
end หากคุณต้องการลงทะเบียนการโทรกลับหลายครั้งคุณสามารถโทรหา Spring.after_fork ได้หลายครั้งด้วยบล็อกที่แตกต่างกัน
สปริงจะตรวจจับการเปลี่ยนแปลงไฟล์โดยอัตโนมัติไปยังไฟล์ใด ๆ ที่โหลดเมื่อเซิร์ฟเวอร์บูท การเปลี่ยนแปลงจะทำให้สภาพแวดล้อมที่ได้รับผลกระทบเริ่มต้นใหม่
หากมีไฟล์หรือไดเรกทอรีเพิ่มเติมที่ควรเรียกใช้แอปพลิเคชันรีสตาร์ทคุณสามารถระบุได้ด้วย Spring.watch :
Spring . watch "config/some_config_file.yml"โดยค่าเริ่มต้นสปริงโพลระบบไฟล์สำหรับการเปลี่ยนแปลงทุกครั้ง 0.2 วินาที วิธีนี้ต้องใช้การกำหนดค่าเป็นศูนย์ แต่ถ้าคุณพบว่าใช้ CPU มากเกินไปคุณสามารถใช้การฟังระบบไฟล์ตามเหตุการณ์ได้โดยการติดตั้งอัญมณี Spring-Watcher-Listen
เพื่อปิดใช้งานข้อความ "Running Via Spring Preloader" ซึ่งจะแสดงในแต่ละครั้งที่คำสั่งรัน:
Spring . quiet = trueตัวแปรสภาพแวดล้อมต่อไปนี้ใช้โดยฤดูใบไม้ผลิ:
DISABLE_SPRING - ถ้าตั้งค่าสปริงจะถูกข้ามและแอปพลิเคชันของคุณจะบูตในกระบวนการเบื้องหน้าSPRING_LOG - เส้นทางไปยังไฟล์ที่สปริงจะเขียนข้อความบันทึกถึงSPRING_TMP_PATH - ไดเรกทอรีที่สปริงควรเขียนไฟล์ชั่วคราว (pidfile และซ็อกเก็ต) โดยค่าเริ่มต้นเราใช้ตัวแปรสภาพแวดล้อม XDG_RUNTIME_DIR หรืออื่น ๆ Dir.tmpdir จากนั้นสร้างไดเรกทอรีใน spring-$UID เราไม่ได้ใช้ไดเรกทอรี tmp/ ไดเรกทอรีของแอปพลิเคชัน Rails ของคุณเพราะอาจอยู่ในระบบไฟล์ซึ่งไม่รองรับซ็อกเก็ต UNIXSPRING_APPLICATION_ID - ใช้เพื่อระบุแอปพลิเคชันรางที่แตกต่างกัน โดยค่าเริ่มต้นมันเป็นแฮช MD5 ของ RUBY_VERSION ปัจจุบันและเส้นทางไปยังรูทโครงการรางของคุณSPRING_SOCKET - เส้นทางที่ควรใช้สำหรับซ็อกเก็ต Unix ซึ่งสปริงใช้ในการสื่อสารกับกระบวนการสปริงเซิร์ฟเวอร์ที่ดำเนินมายาวนาน โดยค่าเริ่มต้นนี่คือ SPRING_TMP_PATH/SPRING_APPLICATION_IDSPRING_PIDFILE - เส้นทางที่ควรใช้ในการจัดเก็บ PID ของกระบวนการเซิร์ฟเวอร์สปริงที่ดำเนินมายาวนาน โดยค่าเริ่มต้นสิ่งนี้เกี่ยวข้องกับเส้นทางซ็อกเก็ต หากเส้นทางซ็อกเก็ตคือ /foo/bar/spring.sock pidfile จะเป็น /foo/bar/spring.pidSPRING_SERVER_COMMAND - คำสั่งให้เรียกใช้เพื่อเริ่มต้นเซิร์ฟเวอร์สปริงเมื่อยังไม่ทำงาน ค่าเริ่มต้นถึง spring _[version]_ server --background สนาม หากคุณต้องการรับข้อมูลเพิ่มเติมเกี่ยวกับฤดูใบไม้ผลิที่ทำคุณสามารถเรียกใช้ฤดูใบไม้ผลิอย่างชัดเจนในเทอร์มินัลแยกต่างหาก:
$ spring server
เอาต์พุตการบันทึกจะถูกพิมพ์ไปยัง stdout นอกจากนี้คุณยังสามารถส่งเอาต์พุตบันทึกไปยังไฟล์ด้วยตัวแปรสภาพแวดล้อม SPRING_LOG