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

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

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 ที่ขับเคลื่อนโดยชุมชน หลังจากรันคำสั่ง คุณอาจได้รับข้อผิดพลาด (ความผิด) หลายประการ ความผิดที่รายงานแต่ละครั้งจะมีข้อมูลทั้งหมดที่จำเป็นในการแก้ไข เช่น คำอธิบายความผิด และไฟล์และหมายเลขบรรทัดที่เกิดการกระทำ

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

ที่ด้านล่างของรายงาน คุณจะเห็นบรรทัดที่อธิบายจำนวนไฟล์ที่ตรวจสอบ จำนวนความผิดทั้งหมด และจำนวนความผิดที่สามารถแก้ไขได้โดยอัตโนมัติ หากคุณต่อท้าย -a หรือ --auto-correct อาร์กิวเมนต์ RuboCop จะพยายามแก้ไขปัญหาที่พบในไฟล์ต้นฉบับของคุณโดยอัตโนมัติ (ซึ่งนำหน้าด้วย [Correctable] )

$ bundle exec rubocop -a

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

สังเกตว่าการแก้ไขแต่ละครั้งนั้นนำหน้าด้วย [Corrected] . อย่างไร . สรุปจำนวนความผิดที่แก้ไขได้แสดงไว้ที่ด้านล่างของรายงาน ในตัวอย่างข้างต้น มีความผิดอีกประการหนึ่งที่แก้ไขได้ซึ่งไม่ได้แก้ไขโดยอัตโนมัติ แม้ว่าจะต่อท้าย -a แล้ว ธง. เนื่องจากการแก้ไขอัตโนมัติบางอย่างอาจเปลี่ยนความหมายของโค้ดเล็กน้อย ดังนั้น RuboCop จึงถือว่าไม่ปลอดภัย หากคุณต้องการแก้ไขความผิดเหล่านี้โดยอัตโนมัติด้วย ให้ใช้ -A หรือ --auto-correct-all ธง.

$ bundle exec rubocop -A

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

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

การกำหนดค่า 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 และข้อตกลงในการเข้ารหัส

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

เมื่อคุณสร้างไฟล์การกำหนดค่าเป็นครั้งแรก คุณจะได้รับข้อความเตือนจำนวนมากเกี่ยวกับการมีอยู่ของตำรวจใหม่ที่เพิ่มเข้ามาแต่ไม่ได้กำหนดค่าไว้ นี่เป็นเพราะ 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
}

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

การตั้งค่าตะขอผูกมัดล่วงหน้า

วิธีที่ยอดเยี่ยมในการตรวจสอบให้แน่ใจว่าโค้ด 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 หลังจากเปลี่ยนไฟล์การกำหนดค่าเพื่อให้การเปลี่ยนแปลงมีผล

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

ในบางครั้ง หากคุณต้องการคอมมิตไฟล์ที่ไม่ผ่านการตรวจสอบทั้งหมด (เช่น งานระหว่างทำ) คุณสามารถข้ามการตรวจสอบแต่ละรายการเป็นกรณีไป:

$ 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 หลังจากนั้น คุณจะได้รับการแสดงผลแบบอินไลน์ของปัญหาที่รายงานในการเช็คอินครั้งต่อๆ ไปและคำขอดึง

Linting และจัดรูปแบบ Ruby Code อัตโนมัติด้วย RuboCop

การจัดรูปแบบอัตโนมัติทางเลือก

แม้ว่า 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 สำหรับทางเลือกที่ไม่มีการกำหนดค่าที่ทุกคนสามารถใช้ได้ แทนที่จะกังวลเกี่ยวกับรายละเอียดเล็กน้อย .

ขอบคุณสำหรับการอ่านและขอให้สนุกกับการเขียนโค้ด!