📦 Pip ile Kurulabilir Python Paketi Oluşturma

Python paket yöneticisi olan pip ile projenizin indirilebilir olmasını sağlamak isterseniz okumaya devam edin.

👀 Hızlı Bakış

  • 🛰️ Bu yazı projenin GitHub ve PyPI üzerinden yayınlanmasını sağlar

  • pip install <paket> komutu ile paketiniz indirilebilir

🧾 PyPI'ya Kayıt olma

👷‍ Dosya Yapısını Oluşturma

📂 Dizin Yapısı

  • 🔸 Açıklama metninizi markdown formatı ile README.md içerisine yazın.

  • 💖 Önemli alanlar kırmızı ile ifade edilmiştir

setup.py
src/
mypkg/
__init__.py
app.py
view.py
tests/
__init__.py
foo/
__init__.py
test_view.py
bar/
__init__.py
test_view.py

‍🧙‍♂ Detaylı bilgi için Choosing a test layout / import rules alanına bakabilirsin.

👨‍🔧 setup.py kurulum dosyası

  • 🔨 Kurulum yapılandırma dosyasıdır.

  • 🏗️ Alttaki taslağı kullanabilirsiniz

from glob import glob
from os.path import basename, splitext
from setuptools import find_packages, setup
VERSION = "2.7.4.3"
README_PATH = "docs/README.md"
# test_requirements = ["behave", "behave-classy", "pytest"]
long_description = ""
with open(README_PATH, "r", encoding="utf-8") as file:
long_description = file.read()
setup(
name="ypackage",
version=VERSION,
license="Apache Software License 2.0",
description="Proje açıklaması",
long_description=long_description,
long_description_content_type="text/markdown",
author="Yunus Emre Ak",
author_email="yemreak.com@gmail.com",
url="https://github.com/yedhrab/YPackage",
packages=find_packages("src"),
package_dir={"": "src"},
py_modules=[splitext(basename(path))[0] for path in glob("src/*.py")],
include_package_data=True,
zip_safe=False,
classifiers=[
# complete classifier list: http://pypi.python.org/pypi?%3Aaction=list_classifiers
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: BSD License",
"Operating System :: Unix",
"Operating System :: POSIX",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
# uncomment if you test on these interpreters:
# "Programming Language :: Python :: Implementation :: IronPython",
# "Programming Language :: Python :: Implementation :: Jython",
# "Programming Language :: Python :: Implementation :: Stackless",
"Topic :: Utilities",
],
project_urls={
"Changelog": "https://github.com/yedhrab/YPackage/blob/master/docs/CHANGELOG.md",
"Issue Tracker": "https://github.com/yedhrab/YPackage/issues",
},
keywords=[
"ypackage", "yedhrab", "yemreak", "gitbook", "github",
"google-search", "google", "link", "drive", "renamer", "bulk"
],
python_requires=">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*",
install_requires=[
# eg: "aspectlib==1.1.1", "six>=1.7",
"google",
"requests",
"pydriller",
"coloredlogs"
],
extras_require={
# eg:
# "rst": ["docutils>=0.11"],
# ":python_version=="2.6"": ["argparse"],
},
setup_requires=[
"pytest-runner",
],
entry_points={
# Komut isteminden çalıştırma
# örndeğin: ypackage
# Kullanım: "ypacakge = ypackage.ypackage:main
"console_scripts": [
"ygitbookintegration = ypackage.cli.integrate_into_gitbook:main",
"ygoogledrive = ypackage.cli.gdrive:main",
"ygooglesearch = ypackage.cli.gsearch:main",
"yfilerenamer = ypackage.cli.file_renamer:main",
"ythemecreator = ypackage.cli.theme_creator:main"
]
},
# tests_require=test_requirements,
)

‍🧙‍♂ Detaylı bilgi için Python Packaging - Setup Script alanına bakabilirsin.

🔨 setup.cfg yapılandırma dosyası

  • 👨‍💼 Bu yapılandırma dosyası sayesinde test işlemleri ve diğer paket hizmetleri yönetilir

  • 👨‍🔧 src/ypackage kısmına kendi paketinizin adını yazın

[flake8]
max-line-length = 99
exclude = */migrations/*
[options]
# tests_require is a list of dependencies that are *absolutely required*
# to run the tests. tests_require is used when running tests from your
# *current* Python environment (that is, not using tox).
# tests_require is ignored by tox.
#
# As such, you can usually get away with neglecting tests_require ---
# it's not a big deal if some of the dependencies get left out.
#
# If you're running tests from your current environment, it's because
# you're actively developing, in which case you usually have an
# environment you built for development. But if you have to change
# environments mid-development for any reason, tests_require can save you
# from getting tripped up.
#
# tests_require is used when running tests and debugging through an IDE like
# PyCharm, to ensure the environment the IDE is using has the requirements.
#
# Unless you're in one of those situations, you can simply ignore this.
tests_require = pytest
[aliases]
# Alias `setup.py test` to `setup.py pytest`
test = pytest
[tool:pytest]
# If a pytest section is found in one of the possible config files
# (pytest.ini, tox.ini or setup.cfg), then pytest will not look for any others,
# so if you add a pytest config section elsewhere,
# you will need to delete this section from setup.cfg.
norecursedirs =
.git
.tox
.env
venv
dist
build
migrations
python_files =
test_*.py
*_test.py
tests.py
addopts =
-ra
--strict
--ignore=docs/conf.py
--ignore=setup.py
--ignore=ci
--ignore=.eggs
--doctest-modules
--doctest-glob=\*.md
--tb=short
--pyargs
# The order of these options matters. testpaths comes after addopts so that
# nameless in testpaths is interpreted as
# --pyargs nameless.
# Any tests in the src/ directory (that is, tests installed with the package)
# can be run by any user with pytest --pyargs nameless.
# Packages that are sensitive to the host machine, most famously NumPy,
# include tests with the installed package so that any user can check
# at any time that everything is working properly.
# If you do choose to make installable tests, this will run the installed
# tests as they are actually installed (same principle as when we ensure that
# we always test the installed version of the package).
# If you have no need for this (and your src/ directory is very large),
# you can save a few milliseconds on testing by telling pytest not to search
# the src/ directory by removing
# --pyargs and nameless from the options here.
testpaths =
src/ypackage
tests/

🏹 __init__ ile modülleri dışa aktarma

  • ⤴️ Dosyanın amacı içerisindeki her paketleri dışarı aktarmaktır

  • 💁‍♂️ Dosyanın içi boş olursa, tüm dizini ele alır

from . import filesystem
from . import common
from . import gitbook
from . import markdown

📢 Bu dosya olmazsa diğer paketleri pip aracı algılayamaz

📑 Manifest Dosyası

  • 🕵️‍♂️ Manifest dosyası ile paket içerisindeki dosyaların projeye dahil olması sağlanır

  • 📌 Bu dosya proje dizininde bulunmalıdır

  • include komutu ile harici dosyalar dahil edilir

  • 🗃️ recursive-include komutu ile dizin ve içerisindeki tüm dosyalar dahil edilir

MANIFEST.in
include LICENSE
include README.md # docs/README.md
# recursive-include src/ypackage/templates *

⚗️ Paketi Test Etme

  • 👨‍🔬 Paket kurulumunu pip install -e . komutu ile yerel olarak yapabilirsin.

  • 💁‍♂️ Kaynak kodunu değiştirmeye ve istenildiği zaman yeniden test edilmeye olanak sağlar

‍🧙‍♂ Detaylı bilgi için Good Integration Practice - Install Package With Pip alanına bakabilirsin.

📡 GitHub'da Yayınlama

GitHub üzeinden repository oluşturun ve projenizi oraya upload edin.

GitHub hakkında detaylar için arama sitemin arama motoruna GitHub yazabilirsiniz

  • GitHub projenizin urline girin

  • Release alanına tıklayın

  • Daha önceden varsa Edit yoksa Create butonuna tıklayın ve yeni bir sürüm oluşturun

  • Tags alanına setup.py dosyamızdaki VERSION değerini yazın

    • Download url kısmındaki ...{VERSION}.tar.gz' yapısından dolayı

    • Örn: 1.0.0

  • Açıklamalarınızı yapıp Update Release butonuna basın

    • Ek olarak dosya eklemenize gerek yoktur

🛰️ Projeyi PyPI'da Yayınlama

📦 Gerekli Paketlerin Kurulumu

Bu işlemleri için python ve pip araçlarının kurulu olması lazımdır.

pip install --upgrade setuptools wheel tqdm
pip install twine

🏗️ Projeyi Derleme

  • Proje dizininize girin (yukarıdaki resimdeki alan)

  • rm -rf build/ dist/ (del build/ dist/ veya el) ile eski proje çalışmalarını silin

  • python setup.py sdist bdist_wheel komutu ile projenizi aktarılmaya hazır hale getirin

  • twine upload dist/* komutu ile PyPI'ya projenizi aktarın

🌌 Projeyi PyPI'da Güncelleme

  • setup.py'daki VERSION bilginizi arttırın

    • Örn: 1.0.1

  • GitHub üzerinden v<VERSION> yeni release oluşturun

    • Örn: v1.0.1

  • 📡 Projeyi PyPI'da Yayınlama alanındakileri uygulayın

🔗 Harici Bağlantılar