Cara Membuat Dan Mempublikasikan Paket Python Pertama Anda
Rangkuman
Bila Anda tidak pernah membuat package Python berminat untuk membuat, posting ini bisa menjadi lokasi yang pas untuk mengawali!
| pyenv: Management versi Python | |
| conda: Management lingkungan Python | |
| puisi: Management package keterikatan | |
| package Python (py-pkgs.org): Langkah membuat package Python | |
| cookiecutter: Alat untuk membikin project Python dari templat | |
| PyPI (Index package Python): Pusat package Python tempat Anda bisa mengeluarkan package Anda dan Anda bisa memakai package dari. | |
| Tes Python Package Indeks: Pusat package Python untuk pengetesan | |
| python-semantic-release: Alat untuk membuat otomatis launching package Python berdasar komit semantik | |
| flake8, hitam, isor: Formater、Linter | 
Siapkan lingkungan dengan Conda
Instalasi berada di sini:
- Ambil penginstal miniconda3 untuk basis Anda. misalkan Miniconda3 macOS Apple M1 ARM 64-bit bash.
- Lakukan penginstal
bash Miniconda3-latest-MacOSX-x86_64.shSekarang, Anda dapat membuat lingkungan conda dengan perintah berikut:
conda create --name <environment name> python=3.9 -yKemudian, 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.toBuat package dengan cookiecutter
Cookiecutter adalah alat untuk membuat proyek python dari templat.
Anda dapat menginstal cookiecutter dengan perintah berikut:
pip install cookiecutteratau Anda dapat menggunakan drink jika Anda menggunakan MacOS
brew install cookiecutterKemudian, buat proyek Python dari template cookiecutter ini: https://github.com/py-pkgs/py-pkgs-cookiecutter
cookiecutter https://github.com/py-pkgs/py-pkgs-cookiecutter.gitTerapkan 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 testspycounts  adalah nama package contoh.
Bangun package Anda
Anda dapat membangun package Python Anda dengan perintah berikut:
poetry buildSemuanya 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>| rule dapat menjadi salah satu dari berikut ini: | |
|---|---|
| 1 | major: peningkatan versi utama mis. 1.2.0 -> 2.0.0 | 
| minor: peningkatan versi minor mis. 1.2.0 -> 1.3.0 | |
| patch: pemutakhiran versi tambalan mis. 1.2.0 -> 1.2.1 | |
| premajor: pemutakhiran versi utama mis. 1.2.0 -> 2.0.0a0 | |
| preminor: peningkatan versi premium mis. 1.2.0 -> 1.3.0a0 | |
| prepatch: pemutakhiran versi pratambalan mis. 1.2.0 -> 1.2.1a0 | |
| 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-xxxxxxSekarang 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 buildPublikasikan oleh poetry publish perintah dengan menentukan test-pypi:
poetry publish -r test-pypiYou’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 publishRilis 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-releaseDan perbarui pyproject.toml:
[tool.semantic_release]
version_variable = "pyproject.toml:version"
version_source = "tag"| Periksa versi berikutnya: semantic-release print-version | |
| Periksa versi saat ini: semantic-release print-version --current | |
| Buat versi baru, komit, dan buat tag (hanya di lokal): semantic-release version | |
| 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
    .venvTindakan 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.
Artikel Terkait Lainnya :
- Belajar Kode Efisien Dan Mudah Dibaca Di Python
- 10 Pustaka Python untuk Pembelajaran Mesin yang Anda Butuhkan di Perangkat Andater
- Node.js Vs Python : Mana Yang Terbaik Untuk Pengembangan Backend Di Tahun 2023?
- Memecahkan Actorle dengan Python
- 10 Tips Memaksimalkan Produktivitas Anda Sebagai Developer Python
