Linting คือการตรวจสอบอัตโนมัติของซอร์สโค้ดเพื่อหาข้อผิดพลาดทางโปรแกรมและโวหาร การตรวจสอบนี้ดำเนินการโดยเครื่องมือวิเคราะห์รหัสคงที่ที่เรียกว่า linter อย่างไรก็ตาม ตัวจัดรูปแบบโค้ดเป็นเครื่องมือที่เกี่ยวข้องกับการจัดรูปแบบซอร์สโค้ด เพื่อให้เป็นไปตามชุดกฎที่กำหนดไว้ล่วงหน้าอย่างเคร่งครัด โดยทั่วไปแล้ว linter จะรายงานการละเมิด แต่โดยปกติแล้วโปรแกรมเมอร์จะแก้ไขปัญหา ในขณะที่ตัวจัดรูปแบบโค้ดมักจะใช้กฎของตนกับซอร์สโค้ดโดยตรง ซึ่งจะแก้ไขข้อผิดพลาดในการจัดรูปแบบโดยอัตโนมัติ
งานในการสร้างสไตล์โค้ดที่สอดคล้องกันมากขึ้นในโปรเจ็กต์มักจะจำเป็นต้องมีการแนะนำเครื่องมือ Linting และ Formatting ที่แยกจากกัน แต่ในบางกรณี เครื่องมือเดียวจะสามารถจัดการกับข้อกังวลทั้งสองได้ ตัวอย่างที่ดีของอย่างหลังคือ RuboCop ซึ่งเป็นเครื่องมือที่เราจะพิจารณาอย่างกว้างขวางในบทความนี้ คุณจะได้เรียนรู้วิธีตั้งค่าในโครงการ Ruby ของคุณและปรับตัวเลือกการกำหนดค่าเพื่อให้ผลลัพธ์ตรงกับความคาดหวังของคุณ นอกเหนือจากการผสานรวมเข้ากับกระบวนการพัฒนาในพื้นที่ของคุณแล้ว คุณยังจะได้เรียนรู้วิธีการทำให้เป็นส่วนหนึ่งของเวิร์กโฟลว์การผสานรวมอย่างต่อเนื่องของคุณ
กำลังติดตั้ง RuboCop
การติดตั้ง RuboCop นั้นตรงไปตรงมาผ่าน RubyGems:
$ gem install rubocop
ตรวจสอบเวอร์ชันที่ติดตั้ง:
$ rubocop --version
1.18.3
หากคุณต้องการใช้ Bundler ให้วางข้อมูลโค้ดด้านล่างใน Gemfile
ของคุณ แล้วเรียกใช้ bundle install
. require: false
ส่วนบอก Bundler.require
ไม่ต้องใช้ gem นั้นในโค้ดของคุณ เนื่องจากจะใช้จากบรรทัดคำสั่งเท่านั้น
gem 'rubocop', require: false
ตรวจสอบเวอร์ชันที่ติดตั้ง:
$ bundle exec rubocop --version
1.18.3
กำลังเรียกใช้ RuboCop
คุณสามารถเรียกใช้ RuboCop โดยใช้การตั้งค่าเริ่มต้นในโครงการของคุณโดยพิมพ์ rubocop
(หรือ bundle exec rubocop
หากติดตั้งด้วย Bundler) ถ้าคุณไม่ส่งอาร์กิวเมนต์ใดๆ ไปยังคำสั่ง คำสั่งจะตรวจสอบไฟล์ต้นทาง Ruby ทั้งหมดในไดเร็กทอรีปัจจุบัน รวมถึงไดเร็กทอรีย่อยทั้งหมด หรือคุณอาจส่งรายการไฟล์และไดเรกทอรีที่ควรวิเคราะห์
$ bundle exec rubocop
$ bundle exec rubocop src/lib
หากไม่มีการกำหนดค่าใดๆ RuboCop จะบังคับใช้หลักเกณฑ์ต่างๆ ที่ระบุไว้ใน Ruby Style Guide ที่ขับเคลื่อนโดยชุมชน หลังจากรันคำสั่ง คุณอาจได้รับข้อผิดพลาด (ความผิด) หลายประการ ความผิดที่รายงานแต่ละครั้งจะมีข้อมูลทั้งหมดที่จำเป็นในการแก้ไข เช่น คำอธิบายความผิด และไฟล์และหมายเลขบรรทัดที่เกิดการกระทำ
ที่ด้านล่างของรายงาน คุณจะเห็นบรรทัดที่อธิบายจำนวนไฟล์ที่ตรวจสอบ จำนวนความผิดทั้งหมด และจำนวนความผิดที่สามารถแก้ไขได้โดยอัตโนมัติ หากคุณต่อท้าย -a
หรือ --auto-correct
อาร์กิวเมนต์ RuboCop จะพยายามแก้ไขปัญหาที่พบในไฟล์ต้นฉบับของคุณโดยอัตโนมัติ (ซึ่งนำหน้าด้วย [Correctable]
)
$ bundle exec rubocop -a
สังเกตว่าการแก้ไขแต่ละครั้งนั้นนำหน้าด้วย [Corrected]
. อย่างไร . สรุปจำนวนความผิดที่แก้ไขได้แสดงไว้ที่ด้านล่างของรายงาน ในตัวอย่างข้างต้น มีความผิดอีกประการหนึ่งที่แก้ไขได้ซึ่งไม่ได้แก้ไขโดยอัตโนมัติ แม้ว่าจะต่อท้าย -a
แล้ว ธง. เนื่องจากการแก้ไขอัตโนมัติบางอย่างอาจเปลี่ยนความหมายของโค้ดเล็กน้อย ดังนั้น RuboCop จึงถือว่าไม่ปลอดภัย หากคุณต้องการแก้ไขความผิดเหล่านี้โดยอัตโนมัติด้วย ให้ใช้ -A
หรือ --auto-correct-all
ธง.
$ bundle exec rubocop -A
หลักการง่ายๆ ที่ควรปฏิบัติตามคือการเรียกใช้ชุดทดสอบของคุณหลังจากใช้ฟังก์ชันแก้ไขอัตโนมัติเพื่อให้แน่ใจว่าการทำงานของโค้ดของคุณจะไม่เปลี่ยนแปลงโดยไม่คาดคิด
การกำหนดค่า RuboCop
สามารถกำหนดค่า RuboCop ผ่าน .rubocop.yml
ไฟล์วางไว้ที่รูทของโปรเจ็กต์ของคุณ หากคุณต้องการใช้การตรวจสอบเดียวกันสำหรับโปรเจ็กต์ทั้งหมด คุณสามารถวางไฟล์กำหนดค่าส่วนกลางในโฮมไดเร็กทอรีของคุณ (~/.rubocop.yml
) หรือไดเรกทอรีการกำหนดค่า XDG (~/.config/rubocop/config.yml
). ไฟล์กำหนดค่าส่วนกลางนี้จะถูกใช้หากไม่พบไฟล์การกำหนดค่าโปรเจ็กต์ที่มีขอบเขตในเครื่องในไดเร็กทอรีปัจจุบันหรือไดเร็กทอรีหลักที่ต่อเนื่องกัน
การกำหนดค่าเริ่มต้นสำหรับ RuboCop จะอยู่ในไดเรกทอรีหลักของการกำหนดค่า (~/.config/rubocop/default.yml
) และไฟล์กำหนดค่าอื่นๆ ทั้งหมดจะรับช่วงมาจากไฟล์นั้น ซึ่งหมายความว่าเมื่อตั้งค่าการกำหนดค่าโครงการ คุณจะต้องทำการเปลี่ยนแปลงที่แตกต่างจากค่าเริ่มต้นเท่านั้น ซึ่งอาจหมายถึงการเปิดหรือปิดการตรวจสอบบางอย่างหรือเปลี่ยนพฤติกรรมหากยอมรับพารามิเตอร์ใด ๆ
RuboCop หมายถึงการตรวจสอบของแต่ละคนว่าเป็นตำรวจ และแต่ละคนมีหน้าที่รับผิดชอบในการตรวจจับความผิดที่เฉพาะเจาะจง ตำรวจที่มีอยู่ยังถูกจัดกลุ่มเป็นแผนกต่อไปนี้:
- Style Cops ส่วนใหญ่จะอ้างอิงจาก Ruby Style Guide ดังกล่าว และพวกเขาตรวจสอบความสอดคล้องของรหัสของคุณ
- ตำรวจเลย์เอาต์จับประเด็นที่เกี่ยวข้องกับการจัดรูปแบบ เช่น การใช้ช่องว่าง
- ตำรวจ Lint ตรวจพบข้อผิดพลาดที่เป็นไปได้ในโค้ดของคุณ คล้ายกับ
ruby -w
แต่มีการตรวจสอบเพิ่มเติมอีกจำนวนมาก - หน่วยเมตริกจะจัดการกับปัญหาที่เกี่ยวข้องกับการวัดซอร์สโค้ด เช่น ความยาวของคลาสและความยาวของเมธอด
- การตั้งชื่อตำรวจเกี่ยวข้องกับหลักการตั้งชื่อ
- ตำรวจรักษาความปลอดภัยช่วยจับประเด็นด้านความปลอดภัยที่อาจเกิดขึ้น
- ตำรวจ Bundler ตรวจหาแนวปฏิบัติที่ไม่ดีในไฟล์ Bundler (เช่น
Gemfile
) - ตำรวจ Gemspec ตรวจหาแนวปฏิบัติที่ไม่ดีใน
.gemspec
ไฟล์.
นอกจากนี้ยังสามารถขยาย RuboCop ผ่าน linters และ formatters เพิ่มเติมได้อีกด้วย คุณสามารถสร้างส่วนขยายของคุณเองหรือใช้ประโยชน์จากส่วนขยายที่มีอยู่ได้หากส่วนขยายนั้นเกี่ยวข้องกับโครงการของคุณ ตัวอย่างเช่น มีส่วนขยาย Rails เพื่อวัตถุประสงค์ในการบังคับใช้แนวทางปฏิบัติที่ดีที่สุดของ Rails และข้อตกลงในการเข้ารหัส
เมื่อคุณสร้างไฟล์การกำหนดค่าเป็นครั้งแรก คุณจะได้รับข้อความเตือนจำนวนมากเกี่ยวกับการมีอยู่ของตำรวจใหม่ที่เพิ่มเข้ามาแต่ไม่ได้กำหนดค่าไว้ นี่เป็นเพราะ RuboCop เพิ่มตำรวจใหม่ในแต่ละรุ่นและสิ่งเหล่านี้ถูกตั้งค่าเป็นสถานะรอดำเนินการพิเศษจนกว่าจะเปิดใช้งานหรือปิดใช้งานอย่างชัดเจนในการกำหนดค่าผู้ใช้ คุณสามารถเปิดหรือปิดการใช้งานตำรวจแต่ละคนที่ระบุไว้ในข้อความทีละคน หรือใช้ข้อมูลโค้ดด้านล่างเพื่อเปิดใช้งานตำรวจใหม่ทั้งหมด (แนะนำ) หลังจากนั้นข้อความจะถูกระงับ
# .rubocop.yml
AllCops:
NewCops: enable
หากคุณไม่ต้องการเล่นซอกับไฟล์การกำหนดค่าและตัวเลือกมากมายที่ RuboCop มอบให้ ให้พิจารณาดูโครงการมาตรฐาน ส่วนใหญ่เป็นรุ่น RuboCop ที่กำหนดค่าไว้ล่วงหน้าซึ่งมีจุดมุ่งหมายเพื่อบังคับใช้รูปแบบที่สอดคล้องกันในโครงการ Ruby ของคุณโดยไม่อนุญาตให้ปรับแต่งกฎใด ๆ คำบรรยายแบบสายฟ้าแลบซึ่งมีการประกาศครั้งแรกจะให้รายละเอียดเพิ่มเติมเกี่ยวกับที่มาและแรงจูงใจ
คุณสามารถติดตั้งได้โดยเพิ่มบรรทัดต่อไปนี้ใน Gemfile
แล้วเรียกใช้ bundle install
.
# Gemfile
gem "standard", group: [:development, :test]
หลังจากนั้น คุณสามารถรัน Standard จากบรรทัดคำสั่งได้ดังนี้:
$ bundle exec standardrb
การเพิ่ม RuboCop ให้กับโปรเจ็กต์ที่มีอยู่
Rubyists ส่วนใหญ่ไม่มีความหรูหราในการทำงานในโครงการกรีนฟิลด์ เวลาในการพัฒนาส่วนใหญ่ของเราถูกใช้ไปกับ codebase แบบเก่าที่อาจทำให้เกิดความผิดที่เกิดจากการทับถมกันอย่างล้นหลามซึ่งไม่สามารถแก้ไขได้ในทันที โชคดีที่ RuboCop มีคุณสมบัติที่มีประโยชน์ซึ่งสร้างรายการที่อนุญาตสำหรับความผิดที่มีอยู่ ซึ่งสามารถแก้ไขได้อย่างช้าๆ เมื่อเวลาผ่านไป ประโยชน์คือช่วยให้คุณสามารถแนะนำผ้าสำลีกับโครงการที่มีอยู่ของคุณโดยไม่ต้องถูกทิ้งระเบิดด้วยข้อผิดพลาดผ้าสำลีที่ไม่สามารถจัดการได้ในขณะที่ตั้งค่าสถานะการละเมิดใหม่ในอนาคต
$ bundle exec rubocop
523 files inspected, 1018 offenses detected
การสร้างไฟล์กำหนดค่ารายการที่อนุญาตสามารถทำได้โดยใช้คำสั่งด้านล่าง:
$ bundle exec rubocop --auto-gen-config
Added inheritance from `.rubocop_todo.yml` in `.rubocop.yml`.
Created .rubocop_todo.yml.
--auto-gen-config
ตัวเลือกรวบรวมความผิดทั้งหมดและจำนวนของพวกเขาและสร้าง .rubocop_todo.yml
ไฟล์ในไดเร็กทอรีปัจจุบันที่ละเว้นความผิดปัจจุบันทั้งหมด สุดท้ายมันทำให้เกิด .rubocop.yml
เพื่อสืบทอดจาก .rubocop_todo.yml
เพื่อที่การรัน RuboCop บน codebase อีกครั้งจะไม่ทำให้เกิดความผิดใดๆ
$ bundle exec rubocop
523 files inspected, no offenses detected
ขณะสร้างไฟล์รายการที่อนุญาต RuboCop จะปิดตำรวจทั้งหมดหากจำนวนการละเมิดเกินเกณฑ์ที่กำหนด (15 โดยค่าเริ่มต้น) โดยทั่วไปนี่ไม่ใช่สิ่งที่คุณต้องการเพราะจะป้องกันไม่ให้มีการตรวจสอบรหัสใหม่กับตำรวจคนนั้นเนื่องจากจำนวนการละเมิดที่มีอยู่ โชคดีที่คุณสามารถเพิ่มเกณฑ์เพื่อไม่ให้ตำรวจปิดการทำงานได้แม้ว่าจะมีการละเมิดจำนวนมากก็ตาม
$ bundle exec rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 10000
--auto-gen-only-exclude
ตัวเลือกทำให้แน่ใจว่าตำรวจแต่ละคนในรายการที่อนุญาตมี Exclude
บล็อกที่แสดงไฟล์ทั้งหมดที่เกิดการละเมิด แทนที่จะเป็น Max
ซึ่งกำหนดจำนวนไฟล์ที่ยกเว้นสูงสุดสำหรับตำรวจ การตั้งค่า --exclude-limit
ยังเปลี่ยนจำนวนไฟล์สูงสุดที่สามารถเพิ่มลงใน Exclude
บล็อกสำหรับตำรวจแต่ละคน การระบุหมายเลขโดยพลการที่มากกว่าจำนวนไฟล์ทั้งหมดที่กำลังตรวจสอบทำให้มั่นใจได้ว่าจะไม่มีตำรวจถูกปิดใช้งานทันที และโค้ดใหม่ใดๆ ที่เพิ่มลงในไฟล์ที่มีอยู่หรือไฟล์ใหม่จะถูกตรวจสอบตามนั้น
การแก้ไขการละเมิดที่มีอยู่
หลังจากสร้าง .rubocop_todo.yml
สิ่งสำคัญคือต้องไม่ลืมการละเมิดที่มีอยู่ แต่ให้ค่อย ๆ จัดการกับการละเมิดทีละเรื่อง คุณสามารถทำได้โดยลบไฟล์ออกจากส่วน Exclude
บล็อกของตำรวจ แล้วแก้ไขรายงานการละเมิด เรียกใช้ชุดทดสอบของคุณเพื่อหลีกเลี่ยงการแนะนำจุดบกพร่อง และกระทำการ เมื่อคุณลบไฟล์ทั้งหมดออกจากตำรวจแล้ว คุณสามารถลบตำรวจออกจากไฟล์ด้วยตนเอง หรือสร้างไฟล์รายการที่อนุญาตใหม่อีกครั้ง อย่าลืมใช้ --auto-correct
ตัวเลือกที่เป็นไปได้เพื่อทำให้กระบวนการเร็วขึ้นมาก
การนำสไตล์มาใช้
RuboCop สามารถกำหนดค่าได้มาก ซึ่งทำให้ใช้งานได้กับโครงการทุกประเภท อย่างไรก็ตาม อาจใช้เวลานานในการกำหนดค่ากฎให้ตรงกับความต้องการของคุณ โดยเฉพาะอย่างยิ่งถ้าคุณไม่เห็นด้วยกับกฎเริ่มต้นจำนวนมาก ในสถานการณ์เช่นนี้ การใช้คู่มือสไตล์ที่มีอยู่อาจเป็นประโยชน์ หลายบริษัทได้เปิดตัวคู่มือสไตล์ Ruby สำหรับการบริโภคของสาธารณะแล้ว เช่น Shopify และ Airbnb การใช้คู่มือสไตล์ที่คุณต้องการใน RuboCop สามารถทำได้โดยการเพิ่มอัญมณีที่เกี่ยวข้องลงใน Gemfile
ของคุณ :
# Gemfile
gem "rubocop-shopify", require: false
จากนั้น กำหนดให้ใช้ในการกำหนดค่าโปรเจ็กต์ของคุณ:
# .rubocop.yml
inherit_gem:
rubocop-shopify: rubocop.yml
การระงับข้อผิดพลาดของผ้าสำลี
แม้ว่า RuboCop เป็นเครื่องมือที่ยอดเยี่ยม แต่ก็สามารถให้ผลบวกปลอมในบางครั้งหรือแนะนำให้แก้ไขโค้ดในลักษณะที่เป็นอันตรายต่อเจตนาของโปรแกรมเมอร์ เมื่อเกิดสถานการณ์ดังกล่าว คุณสามารถเพิกเฉยต่อการละเมิดด้วยความคิดเห็นในซอร์สโค้ด คุณสามารถพูดถึงตำรวจหรือหน่วยงานแต่ละแผนกที่จะปิดการใช้งานดังที่แสดงด้านล่าง:
# rubocop:disable Layout/LineLength, Style
[..]
# rubocop:enable Layout/LineLength, Style
หรือคุณสามารถปิดการใช้งานตำรวจทั้งหมดสำหรับส่วนหนึ่งของรหัสในคราวเดียว:
# rubocop:disable all
[..]
# rubocop:enable all
หากคุณใช้ความคิดเห็นท้ายบรรทัด ตำรวจที่ระบุจะถูกปิดการใช้งานในบรรทัดนั้นเพียงลำพัง
for x in (0..10) # rubocop:disable Style/For
การรวมตัวแก้ไข
สะดวกในการดูคำเตือนและข้อผิดพลาดที่สร้างโดย RuboCop เมื่อคุณพิมพ์โค้ดในตัวแก้ไข แทนที่จะต้องเรียกใช้การตรวจสอบผ่านบรรทัดคำสั่งทุกครั้ง โชคดีที่การรวม RuboCop นั้นมีอยู่ในโปรแกรมแก้ไขโค้ดและ IDE ยอดนิยมส่วนใหญ่ ส่วนใหญ่ผ่านปลั๊กอินของบุคคลที่สาม ใน Visual Studio Code สิ่งที่คุณต้องทำคือติดตั้งส่วนขยาย Ruby นี้และใส่สิ่งต่อไปนี้ใน settings.json
ผู้ใช้ของคุณ ไฟล์:
{
"ruby.lint": {
"rubocop": true
}
}
หากคุณใช้ Vim หรือ Neovim คุณสามารถแสดงการวินิจฉัยของ RuboCop ผ่าน coc.nvim คุณต้องติดตั้งเซิร์ฟเวอร์ภาษา Solargraph (gem install solargraph
) ตามด้วยส่วนขยาย coc-solargraph (:CocInstall coc-solargraph
). หลังจากนั้น กำหนดค่า coc-settings.json
. ของคุณ ไฟล์ดังภาพด้านล่าง:
{
"coc.preferences.formatOnSaveFiletypes": ["ruby"],
"solargraph.autoformat": true,
"solargraph.diagnostics": true,
"solargraph.formatting": true
}
การตั้งค่าตะขอผูกมัดล่วงหน้า
วิธีที่ยอดเยี่ยมในการตรวจสอบให้แน่ใจว่าโค้ด Ruby ทั้งหมดในโปรเจ็กต์ถูก Linted และจัดรูปแบบอย่างถูกต้องก่อนที่จะตรวจสอบในซอร์สคอนโทรลคือการตั้งค่า Git pre-commit hook ที่รัน RuboCop ในแต่ละไฟล์ที่จัดฉาก บทความนี้จะแสดงวิธีตั้งค่าด้วย Overcommit ซึ่งเป็นเครื่องมือสำหรับจัดการและกำหนดค่า Git pre-commit hook แต่คุณยังสามารถรวม RuboCop กับเครื่องมืออื่นๆ ได้หากคุณมีเวิร์กโฟลว์การคอมมิตล่วงหน้าอยู่แล้ว
ขั้นแรก ติดตั้ง Overcommit ผ่าน RubyGems แล้วติดตั้งในโปรเจ็กต์ของคุณ:
$ gem install overcommit
$ overcommit --install # at the root of your project
คำสั่งที่สองด้านบนจะสร้างไฟล์การตั้งค่าเฉพาะ repo (.overcommit.yml
) ในไดเร็กทอรีปัจจุบันและสำรองข้อมูล hook ที่มีอยู่ ไฟล์นี้ขยายการกำหนดค่าเริ่มต้น ดังนั้นคุณเพียงแค่ระบุการกำหนดค่าของคุณตามค่าเริ่มต้น ตัวอย่างเช่น คุณอาจเปิดใช้งานเบ็ดการคอมมิตล่วงหน้าของ RuboCop ผ่านข้อมูลโค้ดต่อไปนี้:
# .overcommit.yml
PreCommit:
RuboCop:
enabled: true
on_warn: fail
problem_on_unmodified_line: ignore
command: ['bundle', 'exec', 'rubocop']
on_warn: fail
การตั้งค่าทำให้ Overcommit ถือว่าคำเตือนเป็นความล้มเหลว ในขณะที่ problem_on_unmodified_line: ignore
ทำให้คำเตือนและข้อผิดพลาดในบรรทัดที่ไม่ได้จัดฉากถูกละเว้น คุณสามารถเรียกดูตัวเลือก hook ที่มีอยู่ทั้งหมดและช่วงของค่าที่ยอมรับได้ในหน้า GitHub ของโครงการ คุณอาจต้องเรียกใช้ overcommit --sign
หลังจากเปลี่ยนไฟล์การกำหนดค่าเพื่อให้การเปลี่ยนแปลงมีผล
ในบางครั้ง หากคุณต้องการคอมมิตไฟล์ที่ไม่ผ่านการตรวจสอบทั้งหมด (เช่น งานระหว่างทำ) คุณสามารถข้ามการตรวจสอบแต่ละรายการเป็นกรณีไป:
$ SKIP=RuboCop git commit -m "WIP: Unfinished work"
การเพิ่ม RuboCop ให้กับเวิร์กโฟลว์ CI ของคุณ
การเรียกใช้การตรวจสอบ RuboCop ในแต่ละคำขอดึงเป็นอีกวิธีหนึ่งในการป้องกันไม่ให้โค้ดที่มีรูปแบบไม่ดีถูกรวมเข้ากับโปรเจ็กต์ของคุณ แม้ว่าคุณจะสามารถตั้งค่าด้วยเครื่องมือ CI ใดๆ ก็ตาม บทความนี้จะกล่าวถึงวิธีเรียกใช้ RuboCop ผ่าน GitHub Actions เท่านั้น
ขั้นตอนแรกคือการสร้าง .github/workflows
ไดเร็กทอรีที่รูทของโปรเจ็กต์ของคุณและ rubocop.yml
ไฟล์ภายในไดเร็กทอรีใหม่ เปิดไฟล์ในตัวแก้ไขของคุณและอัปเดตดังนี้:
# .github/workflows/rubocop.yml
name: Lint code with RuboCop
on: [push, pull_request]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v2
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.0'
bundler-cache: true
- name: Run RuboCop
run: bundle exec rubocop
ไฟล์เวิร์กโฟลว์ด้านบนอธิบายงานเดียวที่จะดำเนินการเมื่อมีการผลักโค้ดไปยัง GitHub หรือเมื่อมีการสร้างคำขอดึงกับสาขาใดๆ job
เป็นลำดับขั้นที่ดำเนินไปตามลำดับ งานนี้จะทำงานเพียงครั้งเดียวบน Ubuntu, MacOS และ Windows เวอร์ชันล่าสุดที่ให้บริการโดย GitHub Actions (ตามที่กำหนดโดย runs-on
และ strategy.matrix
). ขั้นตอนแรกตรวจสอบโค้ดในที่เก็บ ในขณะที่ขั้นตอนถัดไปตั้งค่าห่วงโซ่เครื่องมือและการอ้างอิงของ Ruby และขั้นตอนสุดท้ายดำเนินการ RuboCop
เมื่อคุณแก้ไขไฟล์เสร็จแล้ว ให้บันทึก คอมมิต และกดไปที่ GitHub หลังจากนั้น คุณจะได้รับการแสดงผลแบบอินไลน์ของปัญหาที่รายงานในการเช็คอินครั้งต่อๆ ไปและคำขอดึง
การจัดรูปแบบอัตโนมัติทางเลือก
แม้ว่า RuboCop จะให้ความสามารถในการจัดรูปแบบอัตโนมัติที่ครอบคลุม แต่ก็ควรระวังเครื่องมือทางเลือกในกรณีที่ไม่ตอบสนองความต้องการของคุณอย่างเพียงพอ
สวยกว่า
Prettier เริ่มต้นจากการเป็นเครื่องมือจัดรูปแบบโค้ดที่พิจารณาแล้วสำหรับ JavaScript แต่ตอนนี้รองรับภาษาอื่นๆ มากมาย รวมถึง Ruby การติดตั้งปลั๊กอิน Ruby นั้นตรงไปตรงมา:เพิ่ม prettier
อัญมณีให้กับ Gemfile
. ของคุณ แล้วรัน bundle
.
# Gemfile
gem 'prettier'
ณ จุดนี้ คุณสามารถจัดรูปแบบรหัส Ruby ของคุณด้วย Prettier ผ่านคำสั่งต่อไปนี้:
$ bundle exec rbprettier --write '**/*.rb'
กฎบางอย่างของ Prettier ขัดแย้งกับ RuboCop ดังนั้นจึงจำเป็นต้องปิดการตรวจสอบการจัดรูปแบบของหลังเพื่อไม่ให้รบกวนการทำงานของ Prettier โชคดีที่การปิดการตรวจสอบ RuboCop ที่ขัดแย้งหรือไม่จำเป็นกับ Prettier เป็นเรื่องง่าย สิ่งที่คุณต้องทำคือรับค่าการกำหนดค่า RuboCop ของ Prettier ที่ด้านบนสุดของ .rubocop.yml
ของโปรเจ็กต์ของคุณ ไฟล์:
# .rubocop.yml
inherit_gem:
prettier: rubocop.yml
เมื่อคุณเรียกใช้ RuboCop (ด้วย bundle exec rubocop
) จากนี้ไปจะไม่รายงานความผิดเกี่ยวกับเลย์เอาต์ใดๆ เป็นการปูทางให้พริตเทียร์แก้ไขตามกฎของตัวเอง คุณยังสามารถกำหนดค่าเอาต์พุตของ Prettier ผ่านไฟล์การกำหนดค่า ซึ่งสามารถแชร์ระหว่างโค้ด JavaScript และ Ruby ในโครงการเดียวกัน
RubyFmt
RubyFmt เป็นเครื่องมือจัดรูปแบบโค้ดใหม่ล่าสุดที่เขียนด้วยภาษา Rust และกำลังอยู่ในระหว่างการพัฒนา เช่นเดียวกับ Prettier จุดประสงค์เพื่อเป็นเครื่องมือจัดรูปแบบและไม่ใช่เครื่องมือวิเคราะห์โค้ด มันยังไม่เห็นการเปิดตัวที่เสถียรในตอนนี้ คุณจึงควรงดการยอมรับในตอนนี้ แต่เป็นสิ่งที่ควรจับตามองอย่างแน่นอน
บทสรุป
โค้ด Linting และการจัดรูปแบบอัตโนมัตินำประโยชน์มากมายมาสู่ฐานโค้ด โดยเฉพาะอย่างยิ่งในบริบทของทีมนักพัฒนา แม้ว่าคุณจะไม่ชอบให้ใครบอกวิธีจัดรูปแบบโค้ดของคุณ แต่คุณต้องจำไว้ว่าการแปะทับไม่ได้มีไว้สำหรับคุณเท่านั้น นอกจากนี้ยังเหมาะสำหรับคนอื่นๆ ที่คุณทำงานร่วมกันด้วย เพื่อให้ทุกคนยึดถือหลักการเดียวกัน ขจัดข้อเสียของการจัดการกับรูปแบบการเขียนโค้ดหลายแบบในโปรเจ็กต์เดียวกัน
สิ่งสำคัญเช่นกันที่จะไม่ถือว่าผลลัพธ์ของ linter เป็นพระกิตติคุณ ดังนั้นให้พยายามกำหนดค่าในลักษณะที่ให้ประโยชน์สูงสุดแก่คุณโดยไม่เสียสมาธิจากวัตถุประสงค์หลักของคุณ ด้วยการตั้งค่าการกำหนดค่าที่กว้างขวางของ RuboCop สิ่งนี้ไม่น่าจะมีปัญหา อย่างไรก็ตาม หากคุณพบว่าการกำหนดค่า RuboCop ใช้เวลานานเกินไป คุณสามารถใช้คำแนะนำสไตล์ที่กำหนดไว้ล่วงหน้าตามที่กล่าวไว้ก่อนหน้านี้ หรือใช้ Standard สำหรับทางเลือกที่ไม่มีการกำหนดค่าที่ทุกคนสามารถใช้ได้ แทนที่จะกังวลเกี่ยวกับรายละเอียดเล็กน้อย .
ขอบคุณสำหรับการอ่านและขอให้สนุกกับการเขียนโค้ด!