画像ビューワを作ったので色々な所(Pypi, AUR)にアップロードしようとして躓いた所
SaltViewerというのを開発した.
ざっくりと言うと,mcomix
からmcomix3
への移行の中で中々使い辛い所が出てきたのだ.
それを解決するために自分の欲しい機能を詰めこんだものを作ることにした.
アプリの概要
そもそもmcomix
やmcomix3
の代替なんて作らなくても色々あったりする.vimiv
とか.
でもキーバインドが馴染めなくて,カスタマイズが上手くできなかったりした.
mcomix3
になってから特にDeleteが消えたり,External Commandが上手く設定できなかったりと不便になってしまった.
mcomix2
で我慢していたが,python2は嫌なので作って乗り換えることにした.
特徴
- 数字指定でページジャンプができる
- 先頭と末尾へのジャンプも可能
- 2ページ表示に対応
- 右左,左右への切り替えも対応
- 超シンプルなシングルファイルスクリプト
- アニメーションGIF, SVGに対応
- zip, rar, 7z, pdfに対応(7zはやたらと遅い)
- キーバインドを設定できる
- pipやyayでインストールできる
結構モリモリの割にコード数は非常にコンパクトなはず.
Pypiに上げようとして躓いた所
リポジトリ直下にファイルが多いことは悪だと考えているので,
src
とかsetup.cfg
を置きたくないので,setup.py
一本でいく.
MANIFEST.in
も作らない.
また,これはライブラリではなくコマンドとして実行することを想定している
setup.py
を書く
descriptionも面倒なのでREADME.md
から拝借.
setup_requiresはPKGBUILDでの紆余曲折の名残りで書いたが別にいらないと思う.
本当に最低限しか書いていない.
重要なのが最後のentory_points
で,これによってsalt-viewer
というコマンドを生成してくれる.
これによって,pip
やpyinstaller
みたいにコマンドとして実行できるようにしてくれる.
import setuptools
with open("README.md", "r") as f:
description = f.read()
requirements=[
"natsort",
"pillow",
"send2trash",
"rarfile",
"py7zr",
"cairosvg",
"pdf2image",
]
setuptools.setup(
name="salt-viewer",
version="0.1.2",
description="Simple image viewer",
long_description=description,
long_description_content_type='text/markdown',
url="https://github.com/GuiltyCat/SaltViewer",
author="GuiltyCat",
keywords="image, viewer, archive, animation",
install_requires=requirements,
setup_requires=requirements,
py_modules=['salt_viewer'],
entry_points={"console_scripts": ["salt-viewer=salt_viewer:main"]},
)
アップロードして気付くPypiのstable性
Pypiって同名のパッケージができないようかなり厳密に作られていて,ある意味で融通が聞かない.
なので,アップロードする時は慎重にする必要がある.
具体的には
name
version
こいつを重複してアップロードすることはできない.
一度削除してもだ.
なので,アップロードして失敗に気付くと,自動的にバージョンを上げざるをえなくなる.
AURに上げようとしてPKGBUILDで躓いた所
問題はただ一つだ.公式パッケージにないpythonライブラリへの依存をどう解決するかだ.
これはArchWikiを見ても書いていないしすんごい分かり難いので解説する.
まず,pythonのパッケージだが,基本は公式パッケージのものを優先してdepends
に書く.
これは当然誰もが考えるだろう.でも中には存在しないものもあったりする
そしてpip
はよほど特別なものでない限り使わないのが原則だ.
AURにはある場合
ほぼ間違いなくAURに上がっているのでdepends
にpython-pdf2image
とか書いたりするのだが,
makepkg -s
をすると全ての依存関係が解決されませんでしたとか出て,失敗する.
うんやかんや悩んだが,答えは簡単で公式リポジトリ以外のパッケージはmakepkg
する前に手動でいれるのが原則なのだ.
なので挙動としてはこれでOKで何も問題ないのだ.
逆に言えば,yay -S
とかの場合はmakepkg
を実行する前に依存関係を公式リポジトリとAURから検索してインストールしてくれているのだ.
pkgname=salt-viewer
pkgver=0.1.2
pkgrel=1
arch=("any")
url="https://github.com/GuiltyCat/SaltViewer"
license=("GPL")
depends=("python" "unrar" "poppler" "python-send2trash" "python-pillow" "python-send2trash" "python-cairosvg" "python-natsort" "python-py7zr" "python-pdf2image" "python-rarfile")
makedepends=("python-setuptools")
md5sums=('SKIP')
optdepends=("unarchiver: unrar alternative" "libarchive: unar alternative")
source=("https://github.com/GuiltyCat/SaltViewer/archive/refs/tags/v${pkgver}.tar.gz")
package(){
cd SaltViewer-"${pkgver}"
python setup.py install --verbose --root="${pkgdir}/" --optimize=1
}
このままmakepkg -s
を実行してもpython-pdf2image
とpython-rarfile
は見つからないがこれで正解.
PKGBUILDをアップロードして,yay -S
をすると,自動でAURから探し出してインストールしてくれる.
GitHubから持ってきたGitのLogに個人用メールアドレスが!
今の今まで気付いていなかったが,git log
で登録したメールアドレスが表示されるのね.
それはいいんだけれど,これPublicなのよね.
ということで,盛大なやらかしをしてしまっておりました.
一応対策しましたが,修正しきれていない部分があるかも.
で全てのコミットのuser.emailとuser.nameを書き換えるにはfilter-branch
を使う
git filter-branch -f --env-filter 'export GIT_COMMITTER_EMAIL="<email>"; GIT_COMMITTER_EMAIL="<email>"'
最後にこれを無理矢理push
する.
git push -f origin main --all