[Một Gói Mỗi Ngày] Pre-Commit

By khoanc, at: 15:28 Ngày 12 tháng 8 năm 2024

Thời gian đọc ước tính: __READING_TIME__ phút

[One Package Per Day] Pre-Commit
[One Package Per Day] Pre-Commit
```html

Pre-commit hooks là một công cụ thiết yếu để duy trì chất lượng mã và ngăn chặn các vấn đề trước khi chúng đi vào cơ sở mã. Gói "Pre-commit" tự động hóa việc thực thi các hook này, đảm bảo rằng các tiêu chuẩn mã được đáp ứng mỗi khi nhà phát triển cam kết các thay đổi vào kho lưu trữ.

 

Với "Pre-commit," bạn có thể thiết lập một loạt các kiểm tra mà chạy tự động, phát hiện các lỗi tiềm ẩn và thực thi các thực hành viết mã nhất quán. Gói này đơn giản hóa quy trình bằng cách cung cấp nhiều loại hook tích hợp và hỗ trợ tạo hook tùy chỉnh, cho phép bạn điều chỉnh nó theo nhu cầu cụ thể của dự án của mình.

 

Trong bài đăng này, chúng ta sẽ khám phá cách bắt đầu với "Pre-commit," các tính năng chính của nó và cách nó có thể nâng cao quy trình làm việc phát triển của bạn bằng cách tự động hóa các kiểm tra chất lượng mã.

 

Cài đặt

 

Cung cấp hướng dẫn từng bước về cách cài đặt gói "Pre-commit". Bao gồm các lệnh để cài đặt nó thông qua pip và mọi điều kiện tiên quyết cần thiết để thiết lập nó.

 

pip install pre-commit

 

Bắt đầu

 

Giải thích cách khởi tạo và cấu hình "Pre-commit" trong một dự án. Thảo luận về cách thiết lập tệp .pre-commit-config.yaml với các cấu hình ví dụ.

 

# .pre-commit-config.yaml

repos:
  - repo: https://github.com/psf/black
    rev: 23.7.0 # Sử dụng phiên bản ổn định mới nhất
    hooks:
      - id: black
        args: [--line-length=88] # Điều chỉnh độ dài dòng theo sở thích của bạn

  - repo: https://github.com/pycqa/flake8
    rev: 6.1.0 # Sử dụng phiên bản ổn định mới nhất
    hooks:
      - id: flake8
        args: [--max-line-length=88] # Điều chỉnh độ dài dòng để phù hợp với Black

  - repo: https://github.com/PyCQA/bandit
    rev: 1.7.5 # Sử dụng phiên bản ổn định mới nhất
    hooks:
      - id: bandit
        args: ["--skip=B101"] # Bỏ qua bài kiểm tra B101 cho các câu lệnh assert

  - repo: https://github.com/PyCQA/isort
    rev: 5.12.0 # Sử dụng phiên bản ổn định mới nhất
    hooks:
      - id: isort
        args: ["--profile=black"] # Sử dụng profile Black để tương thích

 

 

Các tính năng chính

 

Làm nổi bật một số tính năng chính của gói "Pre-commit":

 

  • Khả năng mở rộng: Khả năng thêm hook tùy chỉnh.
     
  • Nhiều loại hook tích hợp: Bao gồm linting, định dạng mã và hơn thế nữa.
     
  • Hỗ trợ đa ngôn ngữ: Hoạt động với Python, JavaScript và các ngôn ngữ khác.
     

Các trường hợp sử dụng

 

Thảo luận về các trường hợp sử dụng thực tế mà "Pre-commit" mang lại giá trị cho quy trình làm việc phát triển:

 

  • Thực thi các tiêu chuẩn viết mã.
     
  • Tự động sửa các vấn đề về định dạng.
     
  • Chạy các kiểm tra bảo mật trước khi cam kết mã.
     

Thực tiễn tốt nhất

 

Cung cấp các mẹo về cách tận dụng tối đa "Pre-commit":

 

  • Thường xuyên cập nhật các phiên bản hook.
     
  • Sử dụng cờ --all-files để chạy các hook trên toàn bộ cơ sở mã.
     
  • Kết hợp với các đường ống CI/CD để kiểm tra chất lượng nhất quán.
     

Tùy chỉnh

 

Gói "Pre-commit" cung cấp sự linh hoạt tuyệt vời, cho phép các nhà phát triển tạo các hook tùy chỉnh để đáp ứng các yêu cầu cụ thể của dự án. Hook tùy chỉnh có thể được viết bằng bất kỳ ngôn ngữ nào và dễ dàng tích hợp vào framework pre-commit.

 

Tạo Hook tùy chỉnh

 

Để tạo một hook tùy chỉnh, hãy làm theo các bước sau:

 

  1. Viết tập lệnh Hook: Tạo một tập lệnh thực hiện các kiểm tra hoặc hành động mong muốn. Ví dụ: một tập lệnh Python để kiểm tra các nhận xét TODO có thể trông như thế này:

    #!/usr/bin/env python
    import sys

    def main():
        for filename in sys.argv[1:]:
            with open(filename) as f:
                for i, line in enumerate(f, 1):
                    if 'TODO' in line:
                        print(f"TODO found in {filename}:{i}")
                        return 1
        return 0

    if __name__ == '__main__':
        sys.exit(main())

  2. Thêm Hook vào .pre-commit-config.yaml: Xác định hook tùy chỉnh của bạn trong tệp cấu hình, chỉ định đường dẫn đến tập lệnh của bạn.

    repos:
      - repo: local
        hooks:
          - id: check-todo
            name: Check for TODO comments
            entry: path/to/check_todo.py
            language: python
            files: \.py$
  3. Cài đặt và chạy: Cài đặt các hook pre-commit và chạy chúng để kiểm tra tập lệnh tùy chỉnh của bạn.

    pre-commit install
    pre-commit run --all-files


Sự linh hoạt này cho phép bạn tự động hóa các kiểm tra duy nhất cho dự án của bạn, đảm bảo rằng tất cả các nhà phát triển tuân thủ các tiêu chuẩn tương tự.

 

Tích hợp

 

"Pre-commit" tích hợp liền mạch với các hệ thống kiểm soát phiên bản như Git, giúp dễ dàng đưa vào quy trình làm việc hiện có của bạn. Dưới đây là một số mẹo tích hợp:

 

Tích hợp Git

 

  • Cài đặt Hook tự động: Bằng cách chạy pre-commit install, các hook cần thiết sẽ được thêm vào cấu hình Git cục bộ của bạn. Điều này đảm bảo rằng các hook chạy tự động với mỗi lần commit.
     

  • Tích hợp CI/CD: Tích hợp "Pre-commit" vào các đường ống CI/CD của bạn để thực thi các kiểm tra trên mọi cam kết và yêu cầu kéo. Điều này đảm bảo rằng chất lượng mã được duy trì trên tất cả các nhánh và người đóng góp.

    Ví dụ: trong quy trình làm việc GitHub Actions, bạn có thể thêm một bước để chạy các hook pre-commit:

    jobs:
      lint:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v2
          - name: Set up Python
            uses: actions/setup-python@v2
            with:
              python-version: 3.x
          - name: Install dependencies
            run: |
              python -m pip install --upgrade pip
              pip install pre-commit
          - name: Run Pre-commit
            run: pre-commit run --all-file

 

Các lỗi thường gặp

 

Trong khi sử dụng "Pre-commit," bạn có thể gặp một số lỗi thường gặp. Dưới đây là các giải pháp và mẹo khắc phục sự cố cho chúng:

 

  1. Hook chưa được cài đặt:

    • Thông báo lỗi: The pre-commit hook is not installed. Run 'pre-commit install'.
       
    • Giải pháp: Chạy pre-commit install trong kho lưu trữ của bạn để đảm bảo các hook được cài đặt.
       
  2. Hook thất bại:

    • Thông báo lỗi: Hook failed with exit code 1.
       
    • Giải pháp: Kiểm tra đầu ra để biết các lỗi cụ thể. Nó thường cho biết rằng một tệp không đáp ứng các tiêu chuẩn yêu cầu. Sửa các sự cố và commit lại.
       
  3. Thiếu các phần phụ thuộc:

    • Thông báo lỗi: Command '...' not found.
       
    • Giải pháp: Đảm bảo rằng tất cả các phần phụ thuộc do các hook yêu cầu đều được cài đặt. Bạn có thể chỉ định các phần phụ thuộc bổ sung trong tệp .pre-commit-config.yaml của mình bằng cách sử dụng khóa additional_dependencies.
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v3.3.0
      hooks:
        - id: flake8
          additional_dependencies: [flake8==3.9.0]
  4. Cấu hình không hợp lệ:

    • Thông báo lỗi: Invalid .pre-commit-config.yaml
       
    • Giải pháp: Kiểm tra cú pháp và cấu trúc của tệp .pre-commit-config.yaml của bạn. Sử dụng trình xác thực YAML trực tuyến để đảm bảo cấu hình là hợp lệ.
       

Bằng cách giải quyết các vấn đề thường gặp này, bạn có thể đảm bảo trải nghiệm suôn sẻ hơn trong khi sử dụng gói "Pre-commit".

 

Ưu điểm và nhược điểm

 

Cung cấp một cái nhìn cân bằng về gói "Pre-commit":

 

Ưu điểm

  • Nâng cao chất lượng mã.
     
  • Giảm nỗ lực xem xét mã thủ công.
     
  • Hỗ trợ nhiều hook.
     

Nhược điểm

  • Thời gian thiết lập ban đầu.
     
  • Có khả năng làm chậm với nhiều hook.

 

So sánh với các gói khác

 

Khi nói đến việc duy trì chất lượng mã và thực thi các tiêu chuẩn trong một dự án, có một số công cụ có sẵn. Hãy so sánh "Pre-commit" với các công cụ phổ biến khác như HuskyTalisman, làm nổi bật các tính năng, trường hợp sử dụng và cách chúng khác nhau.

 

Pre-commit so với Husky

 

Husky là một công cụ phổ biến chủ yếu được sử dụng trong các dự án JavaScript để quản lý các hook Git. Dưới đây là cách nó so sánh với "Pre-commit":

 

  • Hỗ trợ ngôn ngữ:

    • Pre-commit: Hỗ trợ nhiều ngôn ngữ lập trình, bao gồm Python, JavaScript, Ruby, v.v. Nó linh hoạt và có thể được sử dụng trong các dự án với nhiều ngăn xếp công nghệ khác nhau.
       
    • Husky: Chủ yếu được thiết kế cho các dự án JavaScript/Node.js, cung cấp khả năng tích hợp sâu với các tập lệnh npm/yarn.
       
  • Cấu hình:

    • Pre-commit: Sử dụng tệp .pre-commit-config.yaml để cấu hình, không phụ thuộc vào ngôn ngữ và dễ hiểu.
       
    • Husky: Cấu hình thường được thực hiện trong package.json hoặc thông qua một tệp cấu hình riêng (.huskyrc), điều này quen thuộc hơn với các nhà phát triển Node.js.
       
  • Hook tích hợp:

    • Pre-commit: Cung cấp nhiều hook tích hợp cho các tác vụ khác nhau như linting, định dạng và kiểm tra bảo mật.
       
    • Husky: Không cung cấp các hook tích hợp nhưng cho phép thực thi các tập lệnh tùy chỉnh, giúp nó linh hoạt cao cho các dự án JavaScript.
       
  • Cộng đồng và Hệ sinh thái:

    • Pre-commit: Có một cộng đồng lớn và hỗ trợ nhiều hook do cộng đồng duy trì, làm cho nó phù hợp với các dự án khác nhau.
       
    • Husky: Được chấp nhận rộng rãi trong hệ sinh thái JavaScript, với sự hỗ trợ mạnh mẽ của cộng đồng và các bản cập nhật thường xuyên.

 

Pre-commit so với Talisman

 

Talisman là một công cụ tập trung vào việc ngăn chặn thông tin nhạy cảm được commit vào kho lưu trữ. Dưới đây là cách nó so với "Pre-commit":

 

  • Mục đích:

    • Pre-commit: Công cụ đa năng có thể thực thi các tiêu chuẩn và kiểm tra chất lượng mã khác nhau.
       
    • Talisman: Chuyên quét các bí mật và dữ liệu nhạy cảm, như khóa API và thông tin xác thực, trong mã trước khi commit.
       
  • Tích hợp:

    • Pre-commit: Dễ dàng tích hợp với nhiều ngôn ngữ và hỗ trợ các hook tùy chỉnh cho các tác vụ khác nhau.
       
    • Talisman: Chủ yếu là một công cụ bảo mật tập trung vào việc xác định dữ liệu có khả năng gây hại, khiến nó trở thành một công cụ bổ sung hơn là một đối thủ cạnh tranh trực tiếp.
       
  • Các trường hợp sử dụng:

    • Pre-commit: Lý tưởng cho các nhóm muốn tự động hóa các kiểm tra chất lượng mã và thực thi các tiêu chuẩn viết mã.
       
    • Talisman: Tốt nhất cho các nhóm ưu tiên bảo mật và bảo vệ dữ liệu, ngăn chặn rò rỉ thông tin nhạy cảm.

 

Các gói liên quan hữu ích

 

Black

 

  • Mô tả: Black là một trình định dạng mã mang tính quyết định cho Python, đảm bảo mã của bạn tuân theo các nguyên tắc về kiểu nhất quán.

  • Sử dụng với Pre-commit: Tự động định dạng các tệp Python trước khi commit, đảm bảo kiểu mã nhất quán.

  • Cấu hình Pre-commit:

    - repo: https://github.com/psf/black
      rev: 23.7.0
      hooks:
        - id: black

 

Flake8

 

  • Mô tả: Flake8 là một công cụ toàn diện để kiểm tra kiểu và chất lượng của mã Python, kết hợp việc thực thi hướng dẫn kiểu PEP 8 với các khả năng linting bổ sung.

  • Sử dụng với Pre-commit: Xác định và sửa các vi phạm kiểu, các biến không sử dụng và các lỗi tiềm ẩn trước khi commit.

  • Cấu hình Pre-commit:

    - repo: https://github.com/pycqa/flake8
      rev: 6.1.0
      hooks:
        - id: flake8

 

isort

 

  • Mô tả: isort tự động sắp xếp và định dạng các câu lệnh import trong các tệp Python theo một thứ tự và kiểu được chỉ định.

  • Sử dụng với Pre-commit: Duy trì một thứ tự import nhất quán trong cơ sở mã của bạn.

  • Cấu hình Pre-commit:

    - repo: https://github.com/PyCQA/isort
      rev: 5.12.0
      hooks:
        - id: isort

 

bandit

 

  • Mô tả: Bandit là một linter bảo mật cho mã Python, được thiết kế để tìm các sự cố bảo mật phổ biến trong các ứng dụng Python.

  • Sử dụng với Pre-commit: Tự động quét mã để tìm các lỗ hổng bảo mật tiềm ẩn trước khi commit.

  • Cấu hình Pre-commit:

    - repo: https://github.com/PyCQA/bandit
      rev: 1.7.5
      hooks:
        - id: bandit
          args: ["--skip=B101"]

 

pytest

 

  • Mô tả: Pytest là một framework kiểm tra phổ biến cho Python, được biết đến với tính dễ sử dụng và các tính năng mạnh mẽ.

  • Sử dụng với Pre-commit: Chạy các bài kiểm tra tự động trước khi commit để đảm bảo tính chính xác của mã.

  • Cấu hình Pre-commit:

    - repo: https://github.com/pre-commit/mirrors-pytest
      rev: v7.4.1
      hooks:
        - id: pytest

 

Kết luận

 

Trong khi "Pre-commit" cung cấp một loạt các chức năng có thể được điều chỉnh theo nhu cầu của bất kỳ dự án nào, các công cụ như HuskyTalisman chuyên biệt hơn, phục vụ cho các trường hợp sử dụng hoặc hệ sinh thái cụ thể. Việc chọn đúng công cụ phụ thuộc vào các yêu cầu, ngôn ngữ và lĩnh vực trọng tâm của dự án. Trong nhiều trường hợp, việc sử dụng "Pre-commit" kết hợp với các công cụ chuyên biệt như Talisman có thể cung cấp phạm vi bảo hiểm toàn diện về chất lượng và bảo mật mã.

 

```
Tag list:
- git
- git hooks
- coding style
- Python clean code
- Python coding style
- hooks install
- Python linter
- pre-commit
- pre-commit install
- Pre-Commit
- pre-commit hooks
- git hooks setup
- isort
- Python linting
- Python code quality
- Code formatting
- Bandit
- git hooks python
- Python development tools
- Black formatter
- Automated code checks
- Flake8

Liên quan

Django

Đọc thêm
Django rest framework Django

Đọc thêm

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.