Cara Membuat Dan Mempublikasikan Paket Python Pertama Anda - CRUDPRO

Cara Membuat Dan Mempublikasikan Paket Python Pertama Anda

Cara Membuat Dan Mempublikasikan package Python Pertama Anda

Rangkuman

Bila Anda tidak pernah membuat package Python berminat untuk membuat, posting ini bisa menjadi lokasi yang pas untuk mengawali!

No
Perlengkapan
1
pyenv: Management versi Python
2
conda: Management lingkungan Python
3
puisi: Management package keterikatan
4
package Python (py-pkgs.org): Langkah membuat package Python
5
cookiecutter: Alat untuk membikin project Python dari templat
6
PyPI (Index package Python): Pusat package Python tempat Anda bisa mengeluarkan package Anda dan Anda bisa memakai package dari.
7
Tes Python Package Indeks: Pusat package Python untuk pengetesan
8
python-semantic-release: Alat untuk membuat otomatis launching package Python berdasar komit semantik
9
flake8, hitam, isor: Formater、Linter

Siapkan lingkungan dengan Conda

Instalasi berada di sini:

  1. Ambil penginstal miniconda3 untuk basis Anda. misalkan Miniconda3 macOS Apple M1 ARM 64-bit bash.
  2. Lakukan penginstal
bash Miniconda3-latest-MacOSX-x86_64.sh

Sekarang, Anda dapat membuat lingkungan conda dengan perintah berikut:

conda create --name <environment name> python=3.9 -y

Kemudian, Anda perlu mengaktifkannya dengan perintah berikut:

conda activate <environment name>

Mengelola package Anda dengan Puisi

Pertama, Anda perlu menginstal puisi:

curl -sSL https://install.python-poetry.org | python3 -

Jika Anda menemukan peringatan berikut, cukup ikuti instruksi dan pindahkan direktori.

Configuration file exists at xxx/Library/Application Support/pypoetry, reusing this directory.

Consider moving configuration to xxx/Library/Preferences/pypoetry, as support for the legacy directory will be removed in an upcoming release.
mkdir -p ~/Library/Preferences/pypoetry
mv ~"/Library/Application Support/pypoetry/config.toml" ~/Library/Preferences/pypoetry/config.to

Buat package dengan cookiecutter

Cookiecutter adalah alat untuk membuat proyek python dari templat.

Anda dapat menginstal cookiecutter dengan perintah berikut:

pip install cookiecutter

atau Anda dapat menggunakan drink jika Anda menggunakan MacOS

brew install cookiecutter

Kemudian, buat proyek Python dari template cookiecutter ini: https://github.com/py-pkgs/py-pkgs-cookiecutter

cookiecutter https://github.com/py-pkgs/py-pkgs-cookiecutter.git

Terapkan package Anda

Anda dapat menerapkan package Anda sendiri dalam proyek Python yang dihasilkan di atas. Strukturnya akan seperti berikut (dari Cara mengemas Python):

pycounts
├── CHANGELOG.md               ┐
├── CONDUCT.md                 │
├── CONTRIBUTING.md            │
├── docs                       │ Package documentation
│   └── ...                    │
├── LICENSE                    │
├── README.md                  ┘
├── pyproject.toml             ┐ 
├── src                        │
│   └── pycounts               │ Package source code, metadata,
│       ├── __init__.py        │ and build instructions 
│       ├── moduleA.py         │
│       └── moduleB.py         ┘
└── tests                      ┐
    └── ...                    ┘ Package tests

pycounts adalah nama package contoh.

Bangun package Anda

Anda dapat membangun package Python Anda dengan perintah berikut:

poetry build

Semuanya sudah siap karena Anda membuat proyek Anda dari template.

Perintah ini akan menghasilkan wheel dan src under dist direktori, yang dapat dikonfigurasi oleh dist_path atau pyproject.toml.

Perbarui versi package

Saat Anda menambahkan beberapa fitur atau membuat versi pertama dari package Anda. Anda perlu memutakhirkan versi package Anda.

Anda dapat melakukannya dengan poetry versionmemerintah:

poetry version <rule>
No
rule dapat menjadi salah satu dari berikut ini:
1 major: peningkatan versi utama mis. 1.2.0 -> 2.0.0
2
minor: peningkatan versi minor mis. 1.2.0 -> 1.3.0
3
patch: pemutakhiran versi tambalan mis. 1.2.0 -> 1.2.1
4
premajor: pemutakhiran versi utama mis. 1.2.0 -> 2.0.0a0
5
preminor: peningkatan versi premium mis. 1.2.0 -> 1.3.0a0
6
prepatch: pemutakhiran versi pratambalan mis. 1.2.0 -> 1.2.1a0
7
dll.

Untuk detail lebih lanjut, Anda dapat membaca https://python-poetry.org/docs/cli/#version.

Publikasikan package Anda ke PyPi

Anda dapat menerbitkan package Python Anda sehingga orang lain dapat menggunakannya sebagai pustaka Python lain yang biasanya Anda instal pip install <package-name>.

Pengaturan PyPi

Anda perlu mendaftar https://test.pypi.org/account/register/ dan https://pypi.org/account/register masing-masing untuk pengujian dan prod. Anda dapat melewati langkah ini jika Anda sudah memiliki akun.

Untuk pengujian, Anda dapat menambahkan sumber test-pypi untuk konfigurasi puisi:

poetry source add test-pypi https://test.pypi.org/simple/

Dan hasilkan kunci API dari https://test.pypi.org/manage/account/ untuk akun pengujian dan setel ke pypi-token.test-pypi

poetry config pypi-token.test-pypi pypi-xxxxxx

Sekarang Anda siap untuk mempublikasikan package Anda ke test-pypi.

Anda harus melakukan hal yang sama untuk pypi https://pypi.org/ dengan mengatur kunci API Anda:

poetry config pypi-token.pypi pypi-xxxxx

(Hati-hati, perintah ini ditetapkan pypi-token.pypi!)

Publikasikan package Anda untuk menguji pypi

Bangun package Anda dengan perintah berikut:

poetry build

Publikasikan oleh poetry publish perintah dengan menentukan test-pypi:

poetry publish -r test-pypi

You’ll be able to check your package with the url: https://test.pypi.org/project/<yourpackage>/

Periksa package Anda diterbitkan untuk menguji pypi

Anda dapat menginstal package Anda dari test pypi

poetry add --source test-pypi <your package>

Dan Anda dapat memeriksa perilaku sebagai pengguna.

Setelah mengonfirmasi semuanya baik-baik saja, sekarang saatnya memublikasikan ke Pypi.

Publikasikan package Anda ke Pypi

Anda dapat menerbitkan package Anda dengan cara yang hampir sama seperti yang Anda lakukan untuk test pypi:

poetry build
poetry publish

Rilis oleh Python Semantic Release (PSR)

Python Semantic Release (PSR) adalah alat untuk mengotomatisasi rilis berdasarkan pesan komit semantik.

Untuk mengkonfigurasi PSR, Anda perlu menginstalnya dengan perintah:

poetry add --dev python-semantic-release

Dan perbarui pyproject.toml:

[tool.semantic_release]
version_variable = "pyproject.toml:version"
version_source = "tag"
No
Ada beberapa opsi perintah:
1
Periksa versi berikutnya: semantic-release print-version
2
Periksa versi saat ini: semantic-release print-version --current
3
Buat versi baru, komit, dan buat tag (hanya di lokal): semantic-release version
4
Publikasikan package Anda (termasuk memperbarui changelog, push to git, build dan upload dist ke rilis github): semantic-release publish

Lint kode Python Anda

Anda dapat gunakan isort,black dan flake8

poetry run isort --check --diff .
poetry run black --check --diff .
poetry run flake8 .

Jika Anda memerlukan konfigurasi ekstra untuk flake8 seperti mengecualikan beberapa direktori atau file, Anda dapat mengonfigurasinya di file .flake8.

[flake8]
exclude =
    # No need to traverse our git directory
    .git,
    # There's no value in checking cache directories
    __pycache__,
    # The conf file is mostly autogenerated, ignore it
    docs/source/conf.py,
    # The old directory contains Flake8 2.0
    old,
    # This contains our built documentation
    build,
    # This contains builds of flake8 that we don't want to check
    dist
    .venv

Tindakan GitHub untuk CI Anda

Saya memisahkan ci-cd dari template cookiecutter karena menerbitkan rilis baru setiap kali PR baru digabungkan ke cabang utama.

Tindakan GitHub — CI

Alur kerja ini dieksekusi saat membuat/memperbarui PR dan mendorong komit baru ke cabang utama. Alur kerja ini meliputi test, lint, codecov, docs, dll.

name: dev

on:
  pull_request:
  push:
    branches:
      - main

jobs:
  ci:
    # Set up operating system
    runs-on: ubuntu-latest

    # Define job steps
    steps:
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"

      - name: Check-out repository
        uses: actions/checkout@v3

      - name: Load cached Poetry installation
        id: cached-poetry
        uses: actions/cache@v3
        with:
          path: ~/.local  # the path depends on the OS
          key: poetry  # increment to reset cache

      - name: Install poetry
        if: steps.cached-poetry.outputs.cache-hit != 'true'
        uses: snok/install-poetry@v1

      - name: Restore cached dependencies
        uses: actions/cache@v3
        with:
          path: ~/.cache/pypoetry
          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-poetry-
      - name: Install package
        run: poetry install

      - name: Lint
        run: |
          poetry run isort --check --diff .
          poetry run black --check --diff .
          poetry run flake8 .

      - name: Test with pytest
        run: poetry run pytest tests/ --cov=<package_name> --cov-report=xml

      - name: Use Codecov to track coverage
        uses: codecov/codecov-action@v3
        with:
          files: ./coverage.xml   # coverage report

      - name: Build documentation
        run: poetry run make html --directory docs/

Silakan ganti nama package dengan nama Anda sendiri.

Tindakan GitHub — semantik-tarik-permintaan

Karena rilis semantik memutuskan tag versi berdasarkan komit di setiap rilis, lebih baik untuk memeriksa apakah judul permintaan tarikan cocok dengan pesan komit semantik (jika Anda menggunakan judul permintaan tarikan untuk setiap komit ke cabang utama.)

name: semantic-pull-request

on:
  pull_request:
    types:
      - opened
      - edited
      - synchronize

jobs:
  run:
    runs-on: ubuntu-latest
    steps:
      - uses: amannn/action-semantic-pull-request@v5
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Tindakan GitHub — rilis

Terakhir, saya terlalu malas untuk membuat rilis baru secara manual di GitHub, jadi saya membuat alur kerja GitHub Actions dengan dispatch_workflow jenis, yang mengeksekusi semantic-release publish.

name: release

on:
  workflow_dispatch:

jobs:
  releaase:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"

      - name: Check-out repository
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Load cached Poetry installation
        id: cached-poetry
        uses: actions/cache@v3
        with:
          path: ~/.local  # the path depends on the OS
          key: poetry  # increment to reset cache

      - name: Install poetry
        if: steps.cached-poetry.outputs.cache-hit != 'true'
        uses: snok/install-poetry@v1

      - name: "Restore cached dependencies"
        uses: actions/cache@v3
        with:
          path: ~/.cache/pypoetry
          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-poetry-
      - name: Install package
        run: poetry install

      - name: Use Python Semantic Release to prepare release
        env:
          # This token is created automatically by GH Actions
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
            git config user.name github-actions
            git config user.email [email protected]
            poetry run semantic-release publish
      - name: Publish to TestPyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.TEST_PYPI_API_TOKEN }}
          repository_url: https://test.pypi.org/legacy/

      - name: Test install from TestPyPI
        run: |
            pip install \
            --index-url https://test.pypi.org/simple/ \
            --extra-index-url https://pypi.org/simple \
            <package_name>
      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          user: __token__
          password: ${{ secrets.PYPI_API_TOKEN }}

Ringkasan

Posting ini mencakup langkah-langkah dasar untuk membuat package Anda sendiri, publikasikan ke PyPi dengan saluran pipa CI/CD menggunakan Tindakan GitHub.

Untuk pekerjaan di masa mendatang, saya akan mencoba mencari aliran rilis yang lebih baik dan menulis tentang dokumentasi.