Tôi có thể xuất bản các dự án Python ở đâu?

Đối với nhiều kỹ sư và nhà phát triển phần mềm, việc sử dụng các thư viện tiêu chuẩn hoặc các đối tượng tích hợp sẵn là không đủ. Để tiết kiệm thời gian và tăng hiệu quả, hầu hết các nhà phát triển xây dựng dựa trên công việc được thực hiện bởi những người khác. Bất kể vấn đề mã hóa là gì, có khả năng một lập trình viên khác đã tạo ra giải pháp cho vấn đề đó. Thường không cần lặp lại quy trình giải quyết vấn đề. Nguyên tắc này được gọi là Đừng lặp lại chính mình hoặc DRY

Mã vượt ra ngoài thư viện tiêu chuẩn thường được chia sẻ giữa các cá nhân, nhóm và thậm chí toàn bộ cộng đồng viết mã. Nếu bạn đã giải quyết được vấn đề mã hóa, bạn có thể cung cấp công khai vấn đề đó dưới dạng cơ sở mã nguồn mở để các nhà phát triển khác hưởng lợi từ đó. Các bộ sưu tập mã này được gọi là các gói

Trong hướng dẫn này, chúng ta sẽ xây dựng một gói Python đơn giản và tạo một đường dẫn tích hợp liên tục (CI) cho nó

Nếu bạn đang sử dụng một ngôn ngữ lập trình phổ biến như JavaScript hoặc Python, sẽ có sẵn các công cụ để xuất bản các gói mã nguồn mở của bạn. Đối với JavaScript, bạn có thể sử dụng Trình quản lý gói nút (NPM). Đối với Python, bạn có thể sử dụng Chỉ mục gói Python, còn được gọi là (PyPI). Chúng tôi sẽ sử dụng PyPI cho hướng dẫn này

điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần

  1. Kiến thức cơ bản về ngôn ngữ lập trình Python
  2. Python được cài đặt trên hệ thống của bạn. Nếu bạn chưa có nó, bạn có thể tải xuống
  3. Tài khoản CircleCI
  4. Tài khoản GitHub
  5. Tài khoản thử nghiệm. pypi. tổ chức và pypi. tổ chức

Ghi chú. Cả hai kiểm tra. pypi. tổ chức và pypi. org yêu cầu bạn xác minh địa chỉ email của mình. Bạn sẽ không thể xuất bản một gói mà không xác nhận. Các bước sau trong hướng dẫn này yêu cầu tên người dùng và mật khẩu để kiểm tra. pypi. tổ chức và pypi. tổ chức giống nhau. Ví dụ, THÊM VÍ DỤ

Tạo gói Python

Như tôi đã đề cập trong phần giới thiệu, nếu chức năng bạn cần không có trong thư viện Python tiêu chuẩn, thì rất có thể có một gói cung cấp chức năng đó. Có hàng trăm nghìn gói có sẵn trên pypi. tổ chức. Bạn có thể tìm kiếm chức năng mình cần hoặc chọn từ các gói đang thịnh hành hoặc mới

Tôi có thể xuất bản các dự án Python ở đâu?

Nhiệm vụ đầu tiên của chúng tôi là tạo một gói chuyển đổi đơn giản có thể chứng minh chức năng của gói trong một khoảng thời gian ngắn. Gói chúng tôi tạo sẽ cho phép lập trình viên chuyển đổi giá trị cho

  • Nhiệt độ (giữa độ C và độ F)
  • Khoảng cách (giữa km và dặm)
  • và những người khác, nếu bạn muốn thêm chúng

Sử dụng quy trình bảo trì gói điển hình làm mô hình của chúng tôi, chúng tôi sẽ cung cấp các bản cập nhật theo thời gian để mở rộng tính hữu dụng của gói và cải thiện tính bảo mật. Chúng tôi sẽ sử dụng nhật ký thay đổi để theo dõi các cập nhật và thông báo cho người dùng về các thay đổi. Thêm về điều đó sau

Cấu trúc dự án

Chọn một vị trí trong hệ thống của bạn và tạo một dự án

python-package
├── convrsn
│   ├── __init__.py
│   └── temperature.py
├── .gitignore
└── setup.py

Dự án có

  • Một thư mục cơ sở có tên là
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    4 (bạn có thể sử dụng bất kỳ tên nào bạn thích)
  • Một thư mục mô-đun/thư viện có tên
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    5 (đây là gói thực tế)
  • Một tệp Python trong thư mục gói có tên
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    6

Đảm bảo rằng tên thư mục mô-đun/thư viện là một tên duy nhất không được sử dụng bởi gói hiện có trong bài kiểm tra Chỉ mục gói Python Kiểm tra. pypi. org hoặc Chỉ mục gói Python pypi. org Thực hiện các truy vấn tìm kiếm để xác nhận tính khả dụng của các tên bạn muốn sử dụng

Với dự án được tạo và đặt tên, chúng ta có thể bắt đầu xây dựng chức năng để chuyển đổi nhiệt độ từ

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

7 sang
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

8 và ngược lại). Logic sẽ được chứa trong tệp
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

6

Sao chép mã này và dán vào tệp

from .temperature import c2f, f2c

0

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

Tiếp theo, sao chép mã này vào tệp

from .temperature import c2f, f2c

1

from .temperature import c2f, f2c

Sao chép mã này vào

from .temperature import c2f, f2c

2, sau đó cập nhật
from .temperature import c2f, f2c

3 và
from .temperature import c2f, f2c

4 bằng thông tin của bạn

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

4

Để kết thúc bước này, có thể sử dụng GitHub. mẫu gitignore cho Python. Sao chép nội dung vào tệp

from .temperature import c2f, f2c

5 của dự án này

Mã này phải tương tự như thế này

Sao chép nó bằng cách chạy

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

6

Xây dựng các tập tin gói

Trước khi chúng tôi bắt đầu bước này, tôi nên đề cập rằng tôi đang sử dụng Python3. Tùy thuộc vào cài đặt Python của bạn, bạn có thể cần sử dụng

from .temperature import c2f, f2c

6 thay vì
from .temperature import c2f, f2c

7, như minh họa trong ví dụ

Trong thiết bị đầu cuối của bạn (ở thư mục gốc của dự án), hãy chạy

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

9

Lệnh này tạo phân phối nguồn và bánh xe có thể chia sẻ có thể được xuất bản trên pypi. tổ chức

Để kiểm tra điều này, hãy tạo một môi trường Python ảo

Ghi chú. Sử dụng một vị trí khác để tránh xung đột tên giữa các mô-đun

Sau đó, cài đặt gói

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

5 bằng phân phối bánh xe. Tùy thuộc vào cài đặt Python của bạn, bạn có thể cần sử dụng
from .temperature import c2f, f2c

9

Chạy

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

2

Tạo một tệp tập lệnh python có tên

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

40 và nhập

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

4

Để kiểm tra, hãy chạy tập lệnh trong khi vẫn ở trong môi trường Python ảo

Tôi có thể xuất bản các dự án Python ở đâu?

Gói Python của chúng tôi đã sẵn sàng để xuất bản

Xuất bản gói Python

Trong bước này của hướng dẫn, chúng ta sẽ thực hiện theo quy trình công việc mà người tạo và bảo trì gói ngoài đời thực có thể sử dụng. Đầu tiên, trước tiên chúng tôi sẽ xuất bản gói của mình để kiểm tra. pypi. org để đảm bảo mọi thứ đang hoạt động. Khi chúng tôi sẵn sàng xuất bản cho người dùng gói của mình, chúng tôi sẽ chuyển sang pypi. tổ chức

Cơ quan đóng gói Python (PYPA) có một gói tiện lợi để trợ giúp việc này có tên là

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

41. Chúng tôi sẽ cài đặt
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

41 sau đó xuất bản để kiểm tra. pypi. tổ chức. Bạn sẽ được yêu cầu nhập thông tin đăng nhập cho trang web

Trong thiết bị đầu cuối của bạn, điều hướng đến thư mục gốc của gói của bạn và chạy

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

7

Tôi có thể xuất bản các dự án Python ở đâu?

Trong một môi trường ảo Python riêng biệt, hãy cài đặt gói. Khi bạn chạy

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

43,
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

44 tìm kiếm các tệp gói trong Chỉ mục gói Python chính thức, trên pypi. tổ chức

Chạy tập lệnh

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

40

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

1

Đây là cách tôi thực hiện

Tôi có thể xuất bản các dự án Python ở đâu?

Thành công. Bây giờ chúng tôi có thể tự động hóa quy trình xuất bản với CircleCI

Tự động xuất bản gói với CircleCI

Không có gì bí mật rằng CircleCI rất tuyệt vời để tự động hóa các tập lệnh. Hóa ra nó cũng rất tuyệt để tạo ra một quy trình có thể lặp lại để xuất bản gói. Chúng tôi sẽ tạo ra một quy trình có thể

  • Nâng cấp từ Test PyPI lên PyPI
  • Duy trì kiểm tra (nếu bạn bao gồm kiểm tra)
  • Chỉ cho phép thông tin đăng nhập được sử dụng theo quy trình mà không chia sẻ với mọi nhà phát triển đang làm việc trên gói

Để bắt đầu, hãy tạo một thư mục có tên

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

46. Trong đó, tạo một tệp và đặt tên là
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

47. Trong
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

48, nhập

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

0

Trong khi bạn đang ở trong môi trường ảo Python chứa gói

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

5 của chúng tôi, hãy chuyển đến thư mục gốc. Pip cài đặt
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

60, sau đó chạy lệnh
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

60

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

1

Cả hai bài kiểm tra sẽ vượt qua thành công

Tôi có thể xuất bản các dự án Python ở đâu?

Tiếp theo, thêm tệp cấu hình CircleCI vào dự án. Tạo một thư mục có tên

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

62. Trong thư mục mới, tạo một tệp có tên
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

63. Trong
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

64, sao chép và dán

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

2

Tệp cấu hình này hướng dẫn đường ống cài đặt các phụ thuộc cần thiết, chạy thử nghiệm và xuất bản gói. Phần

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

65 của cấu hình chỉ định
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

66, trình tự các công việc sẽ được thực hiện và các phần phụ thuộc của chúng

Ví dụ: công việc

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

67 và
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

68 không thể chạy nếu công việc
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

69 bị lỗi. Các công việc
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

67 và
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

68 chỉ chạy trong các chi nhánh của ________ 192 và ________ 193, tương ứng

Kết nối dự án với CircleCI

Bắt đầu bằng cách đẩy dự án của bạn lên GitHub

Kho lưu trữ của bạn phải tương tự như thế này

Bây giờ, hãy truy cập trang Thêm dự án trên bảng điều khiển CircleCI. Nhấp vào Thiết lập dự án

Tôi có thể xuất bản các dự án Python ở đâu?

Click Use Existing Config (vì chúng ta đã có file config riêng). Trong phương thức xuất hiện, nhấp vào Bắt đầu xây dựng

Tôi có thể xuất bản các dự án Python ở đâu?

CircleCI chọn nhánh mặc định, vì vậy nếu bạn sử dụng nhánh không có tệp

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

64, bạn sẽ gặp lỗi xây dựng. Công việc
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

95 sẽ vượt qua, nhưng nếu bạn đang ở trong nhánh
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

93 hoặc
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

92, thì quá trình xây dựng sẽ thất bại. Đó là bởi vì các công việc
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

67 và
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

68 chưa thể chạy

Mặc dù thông tin đăng nhập PyPI Kiểm tra đã được mong đợi khi chúng tôi xuất bản gói bằng cách sử dụng

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

41, nhưng chúng tôi không thể tương tác với thiết bị đầu cuối khi nó đang chạy lệnh trong quy trình. Để cung cấp các thông tin đăng nhập này, chúng tôi có thể thêm cờ vào lệnh.
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

21. Tuy nhiên, vì tệp cấu hình được Git theo dõi và kho lưu trữ Git của chúng tôi là công khai nên việc sử dụng các cờ sẽ là một rủi ro bảo mật. Chúng ta có thể tránh rủi ro này bằng cách tạo các biến môi trường

Tạo biến môi trường

Trong khi vẫn đang sử dụng dự án CircleCI (

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

4), hãy nhấp vào Cài đặt dự án ở phần trên cùng bên phải của trang

Tôi có thể xuất bản các dự án Python ở đâu?

Chọn Biến môi trường từ menu bên phải. Sau đó, nhấp vào Thêm biến môi trường

Tôi có thể xuất bản các dự án Python ở đâu?

Nhập các cặp khóa-giá trị của

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

23 và
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

24. Đây là kết quả mong đợi

Tôi có thể xuất bản các dự án Python ở đâu?

Bước tiếp theo của chúng tôi là tạo nhật ký thay đổi

Thêm nhật ký thay đổi

Trong dự án cục bộ của bạn, hãy tạo một tệp có tên

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

25 và nhập

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

3

Để đảm bảo quá trình xây dựng thành công, chúng tôi cũng cần nâng cấp phiên bản từ

from .temperature import c2f, f2c

2 lên
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

27 để khớp với nhật ký thay đổi

Ghi chú. Nếu bạn không sửa đổi phiên bản, công việc xuất bản sẽ không thành công vì bạn không thể xuất bản cùng một phiên bản hai lần

Cam kết các thay đổi và đẩy lên GitHub để kích hoạt bản dựng

Tôi có thể xuất bản các dự án Python ở đâu?

Cập nhật gói

Để mở rộng chức năng của gói, bạn có thể tạo một nhánh khác và cập nhật nó. Sau đó

  1. Tạo các bài kiểm tra cho nó
  2. Bump phiên bản trong
    from .temperature import c2f, f2c
    
    
    2
  3. Bump phiên bản của tệp
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    29 trong tệp cấu hình CircleCI
  4. Cập nhật
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    40
  5. Đẩy lên GitHub

Khi bạn đã xây dựng thành công, hãy tạo Yêu cầu kéo GitHub (PR) tới nhánh

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

92. Nếu nó có vẻ tốt, hãy hợp nhất nó. Khi quá trình xây dựng đó thành công, hãy tạo PR cho nhánh
def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

93, xem xét và hợp nhất

Hãy xem các yêu cầu kéo ví dụ này

  • PR cho
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    92
  • PR cho chi nhánh
    def c2f(celcius):
        return (float(celcius) * 9/5) + 32
    
    def f2c(fahrenheit):
        return (float(fahrenheit) - 32) * 5/9
    
    
    93

Gói trên Test PyPI và trên PyPI có chức năng bổ sung là

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

45 từ km sang dặm và ngược lại. Các PR đã được hợp nhất khi quá trình xây dựng thành công

Tôi có thể xuất bản các dự án Python ở đâu?

Phần kết luận

Bạn đã có nó, một quy trình thành công, có thể lặp lại phù hợp với trình bảo trì gói Python được kích hoạt bởi CI/CD. Chúng tôi đã thiết lập dự án gói Python, tạo bánh xe Python và cài đặt gói bằng tệp

def c2f(celcius):
    return (float(celcius) * 9/5) + 32

def f2c(fahrenheit):
    return (float(fahrenheit) - 32) * 5/9

29. Chúng tôi đã xuất bản gói từ một máy cục bộ và sau đó tự động hóa quy trình bằng CircleCI

tiếp tục xây dựng


Stanley là Kỹ sư phần mềm và Người viết quảng cáo kỹ thuật, người đã đảm nhiệm nhiều vai trò khác nhau, bao gồm lãnh đạo nhóm kỹ thuật và tham gia cộng đồng. Anh ấy mô tả mình là một digerati (biết chữ trong không gian kỹ thuật số)