ラベル PyPi の投稿を表示しています。 すべての投稿を表示
ラベル PyPi の投稿を表示しています。 すべての投稿を表示

2022年10月27日木曜日

pypiから取得したパッケージをローカルに持ってきてローカルのパッケージを参照するように変更する方法

pypiから取得したパッケージをローカルに持ってきてローカルのパッケージを参照するように変更する方法

概要

ローカルでパッケージを開発したい場合に Pipfile の参照先を Pypi ではなく local に変更する方法を紹介します

環境

  • Ubuntu 18.04
  • Python 3.10.2
  • pipenv 2022.1.8

既存パッケージの削除

pypi から取得したパッケージを一度削除します

  • pipenv uninstall hoge

Pipfile を編集してローカルからインストールするようにする

path を指定することでローカルからインストールできます

  • vim Pipfile
[packages]
hoge = {path="/home/pkg/hoge"}

再度インストール

あとは再度インストールします

  • pipenv install -d

もしパッケージ側を修正した場合は再インストール必要がある

パッケージ側を修正した場合は再度インストールする必要があります

もし面倒な場合はシンボリックリンクに手動で切り替えても OK です

  • pipenv --venv
  • cd /home/pkg/.local/share/virtualenvs/app-Yn-xfOlh/lib/python3.10/site-packages
  • rm -rf hoge
  • ln -s /home/pkg/hoge/hoge hoge

ただこの場合でもパッエージ側にパッケージが追加された場合は再度インストールする必要がある

パッケージ側で pipenv install や poetry add などが発生した場合は再度インストールし直しましょう

パッケージ側が poetry を使っている場合には editable モードは使えない

path を指定する際に editable というオプションが使えるのですがパッケージ側が poetry で作成されている場合以下のようなエラーになりました

hoge = {editable=true, path="/home/pkg/hoge"}
(A "pyproject.toml" file was found, but editable mode currently requires a setuptools-based build.)

2021年5月9日日曜日

プライベート Pypi リポジトリを構築してみた

プライベート Pypi リポジトリを構築してみた

概要

pypiserver という Python 製のツールを使うと簡単に構築できます
今回は docker で動作させます
またパッケージは過去に紹介した手順で作成したパッケージを使います

環境

  • macOS 11.2.3
  • docker 20.10.5
  • Python 3.8.7
  • pypiserver 1.4.2

.htpasswd ファイルの作成

認証は単純なベーシック認証を使います
.htpasswd ファイルを作成します

  • htpasswd -c .htpasswd hawksnowlog

パッケージディレクトリの作成

永続化するためのディレクトリを作成します
用途に合わせてコンテナボリュームなどに変更してください

  • mkdir packages

起動

作成した .htpasswd とパッケージ用のディレクトリをマウントして起動します

  • docker run -p 8080:8080 -v $(pwd)/packages:/data/packages -v $(pwd)/.htpasswd:/data/.htpasswd pypiserver/pypiserver:latest -P .htpasswd

.pypirc 編集

password に関しては .htpasswd ファイル作成時に入力したパスワードを記載してください

  • vim ~/.pypirc
[distutils]
index-servers =
    local

[local]
repository: http://localhost:8080
username: hawksnowlog
password: xxxxxxxx

動作確認

--repository オプションで先程記載した [local] を指定しましょう

  • python3 -m twine upload --repository local dist/*

http://localhost:8080/simple/ にアクセスするとアップロードしたパッケージがあるのが確認できると思います

インストールする場合は以下のように --index-url で localhost を指定します
また .htpasswd ファイルに記載したユーザ名とパスワードを含めるようにします

  • python3 -m pip install --index-url http://hawksnowlog:xxxxxxxx@localhost:8080/simple --no-deps echo-test-hawksnowlog

最後に

若干コンテナのスペックなどを調整しないとレスポンスが遅くなることがあるかもしれません

参考サイト

2021年5月8日土曜日

独自の Pypi パッケージを Gitlab で公開する方法

独自の Pypi パッケージを Gitlab で公開する方法

概要

前回 Pypi パッケージを TestPypi で公開する方法を紹介しました
Pypi の場合パブリックに公開されてしまうのでプライベートなパッケージを配布したい場合には向きません
Gitlab には Pypi のパッケージを公開する機能がありますが
今回は Gitlab で Pypi のパッケージを公開する方法を紹介します

環境

  • macOS 11.2.3
  • Python 3.8.7
  • Gitlab 13.9.4

パッケージの作成

前回のパッケージを流用します
簡単なパッケージ作成のチュートリアルなのでまだパッケージがない場合はこちらの記事を参考に作成してください

Gitlab の準備

何でも OK です
自分で Omnibus インストールを使って Ubuntu 上に構築しても OK です (参考)

また適当のプロジェクトを作成しておいてください
そして ProjectID を確認しておいてください
ProjectID はプロジェクトのトップ画面で確認できます

パーソナルアクセストークンの入手

Gitlab にパッケージをアップロードするためのアクセストークンを取得します

User Settings -> Access Tokens から取得できます
トークンの名前を設定します
この名前はあとでユーザ名として使用します
トークンのスコープに「api」を設定します

.pypirc の作成

pypirc はパッケージをアップロードするリポジトリの情報を記載する認証メタファイルです
デフォルトでは Gitlab に関するリポジトリ情報がないので手動で記載します

  • touch ~/.pypirc
  • vim ~/.pypirc
[distutils]
index-servers =
    gitlab

[gitlab]
repository = https://gitlab.example.com/api/v4/projects/2/packages/pypi
username = upload_package
password = xxxx

repository は Gitlab の package API のエンドポイントを記載します
プロジェクトの ID を記載する部分があるので事前に確認した ID を記載します
username は先程作成した API トークンの名前を記載します
password は取得した API トークンを記載します

公開する

これで準備 OK です
あとは Pypi 同様コマンドで公開できます

  • python3 -m twine upload --repository gitlab dist/*

--repository オプションで先程 .pypirc に記載した [gitlab] のディレクティブ名を指定します
ちゃんと公開されると以下のように Gitlab の「Package Registry」にファイルがアップロードされているのが確認できると思います

動作確認

使う場合は以下のようにします

  • python3 -m pip install --index-url https://upload_package:xxxx@gitlab.example.com/api/v4/projects/2/packages/pypi/simple --no-deps echo-test-hawksnowlog

これでパッケージをインストールできます

参考サイト

2021年5月7日金曜日

独自の Pypi パッケージを作成する方法

独自の Pypi パッケージを作成する方法

概要

Python でパッケージ化した場合 Pypi で配布します
今回はパッケージを作成して Pypi で配布する流れを紹介します

環境

  • macOS 11.2.3
  • Python 3.8.7

パッケージの雛形の作成

  • mkdir src
  • mkdir src/echo_test
  • touch src/echo_test/__init__.py
  • touch LICENSE
  • touch pyproject.toml
  • touch README.md
  • touch setup.cfg
  • touch setup.py
  • mkdir tests

pyproject.toml

ビルドするために必要なツールを記載します
今回は必要最低限のツールだけを記載していますが依存するツールやライブラリがある場合はここに追記します

[build-system]
requires = [
    "setuptools>=42",
    "wheel"
]
build-backend = "setuptools.build_meta"

setup.py

配布するパッケージのメタ情報を記載します
同じようなファイルに setup.cfg というファイルがありますがこちらは静的ファイルになります
setup.py であれば Python でメタ情報を定義できるので動的に変更したい場合には setup.py を使います

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="echo-test-hawksnowlog",
    version="0.0.1",
    author="hawksnowlog",
    author_email="hawksnowlog@mail.domain",
    description="A test pypi package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/hawksnowlog/echo-test",
    project_urls={
        "Bug Tracker": "https://github.com/hawksnowlog/echo-test/issues",
    },
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    package_dir={"": "src"},
    packages=setuptools.find_packages(where="src"),
    python_requires=">=3.6",
)

name の後ろにユーザ名を付与していますが今回はテストなので付与しています
実際に Pypi で公開する場合にはユーザ名の部分を削除して他のパッケージと重複しない名前を設定してください

ソースを公開している Github の URL などは今回適当に設定しています

README.md

パッケージの概要を記載します
setup.py で読み込んでいる内容で Pypi のサイトでも表示される情報になります
インストール方法や簡単な使い方を記載します

# Echo Test

This is a test pypi package. It shows echo messages.

LICENSE

ライセンスの情報を記載します
今回はライセンスはここから MIT ライセンスを選択してコピペしているだけです

Copyright (c) 2018 The Python Packaging Authority

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

ビルド

ここまでできればビルドしてパッケージ化できます
パッケージ化には build ツールが必要になるのでまずはインストールします

  • python3 -m pip install --upgrade build

上記は一度インストールしたら次回以降の実行は不要です
そしてビルドします

  • python3 -m build

ビルドが成功すると dist/ 配下に tar.gz ファイルと whl ファイルが作成されます
これを Pypi にアップロードして公開します

Test Pypi アカウントの作成

今回はパッケージ化の流れを理解するためにテスト用のパッケージを作成しました
Pypi にはそういったテスト用の Pypi があり TestPypi と言います
今回はこの TestPypi を使います
TestPypi は pip コマンドの検索には引っかからず実際にはユーザには公開されない Pypi になります

ユーザやパッケージも一定期間で自動的に削除されるようです
まずはユーザを作成しましょう

https://test.pypi.org/account/register/

<

ここでユーザ名とメールアドレスを登録するとメールが来るので verify しましょう
これで TestPypi が使えるようになります

API トークンを取得する

ビルドした tar.gz と whl ファイルをアップロードするには API トークンが必要になります

Account settings の真ん中くらいに API tokens という項目があるのでここで公開するための API トークンを追加しましょう

<

パッケージをアップロードする

これで TestPypi にパッケージをアップロードできる準備ができました
アップロードするにはビルド時と同様にツールが必要になるので先にインストールします

  • python3 -m pip install --user --upgrade twine

インストールできたら実行して公開します
ユーザ名とパスワードが聞かれた __token__ ユーザを入力しパスワードは先程取得した API トークンを入力しましょう

  • python3 -m twine upload --repository testpypi dist/*

これで TestPypi を確認すると問題なくパッケージがあることが確認できます

動作確認

動作確認してみましょう
pip で先程公開したパッケージをインストールしてみます

  • python3 -m pip install --index-url https://test.pypi.org/simple/ --no-deps echo-test-hawksnowlog

あとは python の REPL を使ってパッケージが import できれば OK です

% python3
Python 3.8.7 (default, Dec 30 2020, 10:14:55) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import echo_test

最後に

実際に Pypi で公開する場合には以下の追加の作業と変更が必要になります

  • Pypi でアカウントの作成と API トークンの取得
  • パッケージの name を被らない名前にしユーザ名の部分を削除する

また TestPypi で公開したパッケージは不要であれば削除しておきましょう

おまけ: 公開前にローカルでテストする方法

例えば適当にファイルを追加してそれを先にローカルで動作確認したい場合があると思います
そんな場合には以下のように先にローカルで pip install してから公開しましょう

  • touch src/echo_test/hello.py
  • vim src/echo_test/hello.py
class Message():
    def __init__(self, message="Hello"):
        self.message = message

    def show(self):
        print(self.message)
  • rm -rf dist/ build/
  • python3 -m build
  • python3 -m pip install dist/echo-test-hawksnowlog-0.0.1.tar.gz
% python3       
Python 3.8.7 (default, Dec 30 2020, 10:14:55) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from echo_test.hello import Message
>>> m = Message()
>>> m.show()
Hello

削除する場合は以下の通りです

  • python3 -m pip uninstall echo-test-hawksnowlog

参考サイト