背景
PyPIに登録した自作パッケージmylibrary
を、condaパッケージに変換して、condaに登録したいです。
以下のサイトを参考にして、condaパッケージの作成を試みました。
https://qiita.com/iisaka51/items/5828a50744be209705d0
環境
- conda 4.6.14
- python 3.6.6
- Xubuntu 18.04
遭遇した問題
conda skeleton
コマンドを実行したら、以下のエラーが発生しました。
$ conda skeleton pypi mylibrary
Leaving build/test directories:
Work:
/home/vagrant/miniconda3/conda-bld/skeleton_1560081893777/work
Test:
/home/vagrant/miniconda3/conda-bld/skeleton_1560081893777/test_tmp
Leaving build/test environments:
Test:
source activate /home/vagrant/miniconda3/conda-bld/skeleton_1560081893777/_test_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placeho
Build:
source activate /home/vagrant/miniconda3/conda-bld/skeleton_1560081893777/_build_env
Error: No source urls found for mylibrary
mylibrary
のソースのURLがないそうです。
エラーの原因を調査
conda-buildのソースを確認
"No source urls found for"でGoogle検索したところ、conda_build
関係のソースが見つかりました。
data = pypi_data['info'] if not is_url else {}
# PyPI will typically have several downloads (source, wheels) for one
# package/version.
urls = [url for url in pypi_data['releases'][version]] if not is_url else [package]
if not is_url and not all_urls:
# Try to find source urls
urls = [url for url in urls if url['packagetype'] == 'sdist']
if not urls:
# Try harder for a download location
if data.get('download_url'):
urls = [defaultdict(str, {'url': data['download_url']})]
if not urls[0]['url']:
# The package doesn't have a url, or maybe it only has a wheel.
sys.exit("Error: Could not build recipe for %s. "
"Could not find any valid urls." % package)
U = parse_url(urls[0]['url'])
if not U.path:
sys.exit("Error: Could not parse url for %s: %s" %
(package, U))
urls[0]['filename'] = U.path.rsplit('/')[-1]
fragment = U.fragment or ''
digest = fragment.split("=")
else:
sys.exit("Error: No source urls found for %s" % package)
PyPIから取得した情報にdownload_url
がないと、"No source urls found for"というエラーが出るようです。
download_urlを調査
Pythonの公式ドキュメントには、download_url
は「パッケージをダウンロードできる場所」と記載されています。
https://docs.python.org/ja/3/distutils/setupscript.html#additional-meta-data
自作パッケージmylibrary
のsetup.py
には、download_url
を指定していませんでした。
参考にしていたサイトでは、conda skeleton pypi autopepa8
を実行しています。しかしautopepa8
のsetup.py
にもdownload_url
はありませんでした。
PyPIの"Download file"参照
PyPIで、autopepa8
の"Download file"を見てみると、tar.gz
が登録されています。
私が作成したmylibrary
にはwhl
ファイルはありますが、tar.gz
はありません。
どうやら、tar.gz
がPyPIにアップロードされていないことが、原因のようです。
原因
PyPIにアップロードする際python setup.py bdist_wheel
だけを実行していて、python setup.py sdist
を実行していないことが原因でした。
解決方法
PyPIに登録する際は、python setup.py sdist bdist_wheel
を実行して、sdistとwheelをPyPIにアップロードするようにしました。
その状態でconda skeleton
を実行したら、エラーはなくなりmeta.yaml
が生成されました。