自分のMacbook Air(2020, M1)では、conda skeleton pypi <package-name>コマンドが失敗した。

参考に、自分の環境におけるエラーメッセージを示す。

Traceback (most recent call last):
  File "/opt/conda/bin/conda-skeleton", line 11, in <module>
    sys.exit(main())
  File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 64, in main
    return execute(sys.argv[1:])
  File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 59, in execute
    api.skeletonize(args.packages, args.repo, output_dir=args.output_dir, recursive=args.recursive,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/api.py", line 276, in skeletonize
    skeleton_return = module.skeletonize(packages, output_dir=output_dir, version=version,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 315, in skeletonize
    get_package_metadata(package, d, data, output_dir, python_version,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 752, in get_package_metadata
    requires = get_requirements(package, pkginfo, all_extras=all_extras)
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1115, in get_requirements
    for extra in pkginfo['extras_require']:
KeyError: 'extras_require'

最終的にこれを克服してパッケージをリリースできたので、対処法をメモする。

最初に

これは、Python: 3.9, conda-build: v3.21.8で確認されているものである。

以下のようにissueが立てられていることもあり、今後のアップデートで改善される余地があることは理解しておくべきである。自分の環境では、Python 3.7, 3.8においても同様の事象でエラーとなった。

https://github.com/conda/conda-build/issues/4354

エラー解決までの経緯

さきほど示したissueにあったが、Python 3.6でbuildすることで実行可能になるとの報告があった。

したがって、以下のコマンドでPythonのバージョンを3.6に指定した上で実行した。

conda skeleton pypi --python-version 3.6 <package-name>

するとエラーメッセージ内容が以下のように変化した。

Traceback (most recent call last):
  File "/opt/conda/bin/conda-skeleton", line 11, in <module>
    sys.exit(main())
  File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 64, in main
    return execute(sys.argv[1:])
  File "/opt/conda/lib/python3.9/site-packages/conda_build/cli/main_skeleton.py", line 59, in execute
    api.skeletonize(args.packages, args.repo, output_dir=args.output_dir, recursive=args.recursive,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/api.py", line 276, in skeletonize
    skeleton_return = module.skeletonize(packages, output_dir=output_dir, version=version,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 315, in skeletonize
    get_package_metadata(package, d, data, output_dir, python_version,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 741, in get_package_metadata
    pkginfo = get_pkginfo(package,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1192, in get_pkginfo
    run_setuppy(src_dir, tempdir, python_version, extra_specs=extra_specs, config=config,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/skeletons/pypi.py", line 1233, in run_setuppy
    create_env(config.host_prefix, specs_or_actions=specs, env='host',
  File "/opt/conda/lib/python3.9/site-packages/conda_build/environ.py", line 882, in create_env
    actions = get_install_actions(prefix, tuple(specs), env,
  File "/opt/conda/lib/python3.9/site-packages/conda_build/environ.py", line 801, in get_install_actions
    raise DependencyNeedsBuildingError(exc, subdir=subdir)
conda_build.exceptions.DependencyNeedsBuildingError: Unsatisfiable dependencies for platform linux-aarch64: {'python=3.6'}

要するにPython 3.6はARMチップに対応してないよ、ということ。

解決策

これらを踏まえると以下の条件が揃えばconda skeletonできそうだということがわかる。

  1. Python 3.6を使用する
  2. AMD環境で実行する

これをARMチップ搭載のM1 Macbook上で実行するために、DockerによりAMDアーキテクチャのイメージを使用することにした。もちろん速度は劣るが、もう一台パソコンを購入するよりはマシだと考えている。

追記(2022年6月16日)

これから紹介するようなDocker環境を構築しなくても、もっと簡単にmeta.yamlを生成できる方法が見つかったので追記する。

それは、grayskullというパッケージを利用する方法である。

grayskullはconda-forgeチャンネルから簡単にダウンロードできる。

conda install -c conda-forge grayskull

あとは、以下の通りgrayskullコマンドを実行すれば自動的にmeta.yamlファイルを生成してくれる。

grayskull pypi <package-name>

dockerで環境構築したり、Pythonで取得URLを変えたりしたあの努力はなんだったんだ…

— 追記終わり(2022年6月16日) —

Docker環境の構築

使用したimage: continuumio/miniconda3: 4.11.0のAMD版

実際に使用した環境(Dockerfile等)は以下で公開している。

なお、これらは以下で紹介する動作をimageのbuildの際に既に行ってしまっている、もしくはシェルスクリプトに含んでしまっているため、注意していただきたい。ゼロからやりたい方は上記のimageをベースに自分で環境構築することをおすすめする。

https://github.com/yu9824/conda-skeleton

【参考】プラットフォームを指定したimageの利用の仕方

たとえば、Dockerfileに書き込むのであれば以下。

FROM --platform=amd64 continuumio/miniconda3:4.11.0

直接docker hubにあるものをrunしたい場合は、以下。

docker run -it --rm --platform linux/amd64 continuumio/miniconda3:4.11.0 /bin/bash

参考

関連

https://note.yu9824.com/howto/2022/05/07/conda-package-release/