Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

Ruby Gems, Gemfile &Bundler (คู่มือขั้นสูงสุด)

อัญมณีทับทิมคืออะไร

อัญมณีเป็นแพ็คเกจที่คุณสามารถดาวน์โหลดและติดตั้งได้ เมื่อคุณต้องการอัญมณีที่ติดตั้ง คุณกำลังเพิ่มฟังก์ชันพิเศษให้กับโปรแกรม Ruby ของคุณ

อัญมณีช่วยให้คุณ :

  • เพิ่มคุณสมบัติการเข้าสู่ระบบในแอป Rails ของคุณ
  • ทำงานกับบริการภายนอกได้อย่างง่ายดาย (เช่น API)
  • สร้างเว็บแอปพลิเคชัน

นั่นเป็นเพียงตัวอย่างบางส่วน อัญมณีทุกชิ้นมีเป้าหมายของตัวเอง

ทำไมเราถึงใช้อัญมณี

  • เป็นวิธีที่เราแชร์ไลบรารีและเครื่องมือใน Ruby
  • โครงสร้างไฟล์และรูปแบบของอัญมณีทำให้ง่ายต่อการเข้าใจวิธีการทำงาน
  • ไฟล์ข้อกำหนด (“.spec”) ที่มาพร้อมกับทุก gem อธิบายถึงการขึ้นต่อกัน (อัญมณีที่จำเป็นอื่นๆ) ดังนั้นโค้ดจึงมีทุกสิ่งที่จำเป็นในการทำงาน

ต้องขอบคุณ RubyGems ที่เรามีระบบนิเวศที่สมบูรณ์ของไลบรารีที่เป็นประโยชน์ เพียงแค่ gem install ออกไป!

รายการอัญมณีที่จำเป็นสำหรับโครงการที่กำหนด (ไม่ใช่อัญมณี) สามารถแสดงรายการในไฟล์พิเศษที่เรียกว่า "Gemfile" เพื่อให้ Bundler ติดตั้งได้โดยอัตโนมัติ ทั้งสองจะกล่าวถึงในภายหลังในคู่มือนี้

ตัวอย่างอัญมณีมีอะไรบ้าง

  • Rails และส่วนประกอบทั้งหมด (ActiveRecord, ActiveSupport ฯลฯ) ถูกแจกจ่ายเป็น Ruby gem
  • Pry ทางเลือกที่ทรงพลังสำหรับ irb
  • Nokogiri โปรแกรมแยกวิเคราะห์ XML และ HTML ยอดนิยม

อัญมณีส่วนใหญ่เป็นรหัสทับทิมแท้

อัญมณีบางส่วนมีส่วนขยาย Ruby C เพื่อประสิทธิภาพที่ดีขึ้น

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

ตอนนี้ :

มาเรียนรู้เพิ่มเติมเกี่ยวกับอัญมณีด้วยการสร้างของคุณเองและดูไฟล์ที่สร้างอัญมณี

วิธีการสร้าง RubyGem

คุณสามารถเตรียมไฟล์สำหรับ gem ใหม่ได้โดยเรียกใช้ bundle gem <name> .

ตัวอย่างเช่น :

bundle gem awesome_gem

อัญมณี ประกอบด้วยโครงสร้างดังต่อไปนี้ :

├── awesome_gem.gemspec
├── bin
│   ├── console
│   └── setup
├── Gemfile
├── lib
│   ├── awesome_gem
│   │   └── version.rb
│   └── awesome_gem.rb
├── Rakefile
├── README.md
└── test
    ├── awesome_gem_test.rb
    └── test_helper.rb

.gemspec นี้ ไฟล์เป็นที่ที่คุณจะค้นหาข้อมูลทั้งหมดเกี่ยวกับอัญมณี .

รวมถึง :

  • ชื่ออัญมณี
  • สรุปอัญมณี (คำอธิบายสั้นๆ)
  • ชื่อผู้แต่ง
  • รายการการพึ่งพา
  • รายการไฟล์ที่จะรวมไว้ในอัญมณี
  • ไม่บังคับ:ที่อยู่อีเมลของผู้เขียน, URL ของโครงการ (โฮมเพจ), ไฟล์สั่งการ, ส่วนขยาย c, คำอธิบายแบบยาว

เวอร์ชันของ gem นั้นถูกกำหนดให้เป็นค่าคงที่ใน lib/<gem_name>/version.rb .

นี่คือตัวอย่าง gemspec :

Gem::Specification.new do |spec|
  spec.name          = "awesome_gem"
  spec.version       = AwesomeGem::VERSION
  spec.authors       = ["Jesus Castello"]
  spec.summary       = "Example gem for article about Ruby gems"

  spec.files         = Dir['**/**'].grep_v(/.gem$/)

  spec.require_paths = ["lib"]

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "minitest", "~> 5.0"
end

require_paths array เป็นที่ที่ Ruby จะค้นหาไฟล์ gem ของคุณเมื่อคุณต้องการ สิ่งนี้ทำให้คุณสามารถใส่รหัสของคุณภายใต้ lib/<gem_name>/ แล้วต้องใช้ require "<gem_name>/<file_name>" .

ตัวอย่างเช่น :

ไฟล์ชื่อ lib/awesome_gem/parser.rb จะต้องเป็น require "awesome_gem/parser" จากทุกที่ภายในอัญมณี

คุณจะมีความต้องการส่วนใหญ่ใน lib/<gem_name>.rb (ไฟล์เดียวที่รูทของ /lib )

นั่นคือไฟล์ที่จะโหลดเมื่อคุณ require อัญมณี!

ถัดไป :

add_development_dependency เส้นกำหนดอัญมณีที่คุณจะใช้ในระหว่างการพัฒนา

เหล่านี้คืออัญมณีอย่าง minitest, RSpec หรือ pry

ขณะที่ add_dependency กำหนดอัญมณีที่คุณใช้เป็นส่วนหนึ่งของรหัสของคุณ

เมื่อคุณเปลี่ยนข้อมูลสรุป &คำอธิบายจากค่าเริ่มต้นแล้ว… คุณจะสามารถโหลดเซสชัน irb ด้วยอัญมณีของคุณโดยใช้ bin/console โปรแกรมที่ bundle gem สร้างมาเพื่อคุณ

ตัวอย่าง :

$ bin/console

irb(main):001:0>
irb(main):002:0>
irb(main):003:0> AwesomeGem
=> AwesomeGem
irb(main):004:0>
irb(main):005:0> AwesomeGem::VERSION
=> "0.1.0"

จากนั้นคุณสามารถจัดแพ็คเกจอัญมณีโดยใช้ gem build <name>.gemspec &เผยแพร่ไปที่ rubygems.org โดยใช้ gem push .

มัดเดอร์คืออะไร

ในขณะที่เรียนรู้เกี่ยวกับ Ruby gem คุณอาจอ่านเกี่ยวกับ Bundler .

แต่ Bundler คืออะไรกันแน่?

Bundler เป็นเครื่องมือสำหรับการจัดการการพึ่งพา .

RubyGems จัดการเรื่องนี้อยู่แล้วใช่หรือไม่

ก็ใช่… แต่ เฉพาะตัวอัญมณีเท่านั้น .

แอปพลิเคชัน Ruby ปกติของคุณไม่ได้สร้างเป็นอัญมณี ดังนั้นจึงไม่ได้รับฟีเจอร์นี้

นั่นเป็นสาเหตุที่ Bundler มีอยู่จริง!

ทำความเข้าใจ Gemfiles

คุณเคยเห็น Gemfile . เหล่านั้นไหม ไฟล์?

นั่นคือที่ที่คุณเขียนอัญมณีที่คุณต้องการใช้สำหรับแอปพลิเคชัน Ruby ของคุณ .

อัญมณีเหล่านี้จะโหลดให้คุณโดยไม่ต้อง require เหล่านั้น

Gemfile หน้าตาแบบนี้ :

ruby '2.5.0'

gem 'rails', '~> 5.2.1'
gem 'sqlite3'
gem 'puma', '~> 3.11'
gem 'bootsnap', '>= 1.1.0', require: false

Bundler (และ RubyGems ตั้งแต่เวอร์ชัน 2.0) สามารถอ่านไฟล์นี้และติดตั้งเวอร์ชันที่ร้องขอของ gem เหล่านี้ได้

นี่คือสิ่งที่คุณควรเห็นเมื่อเรียกใช้ bundle install คำสั่ง:

Using turbolinks-source 5.1.0
Using turbolinks 5.1.1
Using uglifier 4.1.18
Using web-console 3.6.2

Bundle complete! 18 Gemfile dependencies, 78 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

ตอนนี้ :

สัญลักษณ์เหล่านี้คืออะไร (เช่น ~> ) ใช้เมื่อประกาศเวอร์ชันสำหรับอัญมณีทุกอันใน Gemfile ของคุณหรือไม่

สิ่งเหล่านี้ทำให้คุณสามารถขอรุ่นต่างๆ .

คุณอาจพูดว่า “ฉันต้องการให้เวอร์ชันนั้นเท่ากับหรือมากกว่า 1.2 แต่น้อยกว่า 2.0”

ซึ่งจะมีลักษณะดังนี้:

gem 'puma', '~> 1.2'

~> เป็นทางลัดสำหรับช่วงนี้ :

gem 'puma', '>= 1.2', '< 2.0'

ในกรณีของ ~> 5.2.1 หมายความว่า ตรงนี้ :

'>= 5.2.1', '< 5.3'

ยิ่งหมายเลขเวอร์ชันเฉพาะเจาะจงมากเท่าใด ก็ยิ่งจำกัดช่วงของเวอร์ชันมากขึ้นเท่านั้น

ตัวเลือก Gemfile &Gemfile.lock

คุณมีตัวเลือกสองสามอย่างเมื่อต้องการอัญมณีใน Gemfile

ตัวอย่างเช่น :

คุณอาจต้องการดึงอัญมณีจากแหล่งอื่น เช่น GitHub

มีประโยชน์เมื่อคุณต้องการใช้เวอร์ชันล่าสุดของโครงการ แม้ว่าจะยังไม่ได้เผยแพร่บน rubygems.org

นี่คือตัวอย่าง:

gem "rails", git: "[email protected]:rails/rails.git"

คุณสามารถส่ง branch ตัวเลือกในการใช้รหัสจากสาขาที่ไม่ใช่มาสเตอร์

ถูกใจสิ่งนี้ :

gem "awesome_print", git: "[email protected]:awesome-print/awesome_print.git", branch: "v2"

อีกตัวเลือกหนึ่งที่คุณอาจพบคือ require: false .

ทำอะไรได้บ้าง

มันบอกให้ Bundler ไม่ต้องการอัญมณีให้คุณโดยอัตโนมัติ ซึ่งหมายความว่าคุณจะต้อง require ในรหัสของคุณเมื่อคุณต้องการ

ใช้สำหรับอัญมณีที่มีขอบเขตจำกัด

ตัวอย่างเช่น :

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

คุณยังสามารถจัดกลุ่มอัญมณีตามสภาพแวดล้อม .

นั่นหมายความว่าคุณสามารถมีอัญมณีที่ติดตั้งและโหลดไว้ในระหว่างการพัฒนาเท่านั้น (เช่น capybara &pry )

สุดท้าย Bundler จะสร้าง Gemfile.lock .

ต่างกันอย่างไร?

Gemfile.lock สร้างโดยอัตโนมัติ &มันบอกว่า ทุกเวอร์ชันของอัญมณีถูกติดตั้ง .

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

คำสั่ง Gem &Bundler ที่มีประโยชน์

คำสั่ง คำอธิบาย
รายการอัญมณี แสดงรายการอัญมณีที่ติดตั้งทั้งหมดของคุณ ยอมรับอาร์กิวเมนต์สำหรับการกรองอัญมณีตามชื่อ (ตัวอย่าง:gem list active )
อัญมณีที่ ให้เส้นทางที่ติดตั้งอัญมณี
ค้นหาอัญมณี ค้นหาอัญมณีจากแหล่งที่กำหนดค่าไว้ (ค่าเริ่มต้น:rubygems.org) ใช้นิพจน์ทั่วไป (ตัวอย่าง:gem search "\Aawesome_" )
อัญมณี env แสดงข้อมูลเกี่ยวกับสภาพแวดล้อมอัญมณีของคุณ (เวอร์ชัน เส้นทาง การกำหนดค่า)
ติดตั้งอัญมณี -v อนุญาตให้คุณติดตั้งเวอร์ชันอัญมณีเฉพาะ (ตัวอย่าง:gem install sinatra -v 2.0.0 )
กลุ่ม ได้แก่ สร้างการแสดงภาพกราฟการพึ่งพาสำหรับโครงการปัจจุบันของคุณ
การแสดงมัด แสดงข้อมูลเกี่ยวกับ gem ที่ติดตั้งผ่าน Bundler ต้องอยู่ในโฟลเดอร์ที่มี Gemfile
กลุ่มล้าสมัย แสดงรายการอัญมณีที่ล้าสมัยในโปรเจ็กต์ปัจจุบัน สามารถใช้ --groups ตัวเลือกเพื่อจัดกลุ่ม
คอนโซลชุด เรียกใช้เซสชัน irb ด้วย gems จาก Gemfile ของโปรเจ็กต์ปัจจุบัน

สรุป

คุณได้เรียนรู้เกี่ยวกับ RubyGems ซึ่งเป็นระบบแพ็คเกจสำหรับ Ruby แล้ว คุณยังได้เรียนรู้วิธีการจัดโครงสร้างอัญมณี Gemfile, Bundler คืออะไร &ความแตกต่างระหว่าง Gemfile &Gemfile.lock .

ฉันหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์!

โปรดแบ่งปันบทความนี้ สมัครรับจดหมายข่าวหากคุณยังไม่ได้ (นักพัฒนา Ruby กว่า 9000 คน!) และดูหนังสือ Ruby ของฉัน

ขอบคุณสำหรับการอ่านและมีวันที่ดี🙂