pipでbash/zshの補完ファイルをインストールさせるパッケージを作る
Pocket

pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。
で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。

Sponsored Links

■ setup.py

import os
import platform
import setuptools

# 補完ファイルインストール用関数
def get_data_files():

    # 補完ファイルのインストール先を取得する関数
    def get_completefile_install_location(shell):
        # pathのprefixを定義
        prefix = ''

        # osの種類を取得
        uname = platform.uname()[0]

        # 実行ユーザがrootかどうかでprefixを変更
        if os.geteuid() == 0:
            ''' システムインストール時の挙動 '''
            if uname == 'Linux' and shell == 'bash':
                prefix = '/'
            elif uname == 'Linux' and shell == 'zsh':
                prefix = '/usr/local'
            elif uname == 'Darwin' and shell == 'bash':
                prefix = '/'
            elif uname == 'Darwin' and shell == 'zsh':
                prefix = '/usr'

        # shellの種類に応じてインストール先のlocationを変更
        if shell == 'bash':
            location = os.path.join(prefix, 'etc/bash_completion.d')
        elif shell == 'zsh':
            location = os.path.join(prefix, 'share/zsh/site-functions')
        else:
            raise ValueError('unsupported shell: {0}'.format(shell))

        # locationを返す
        return location

    # locationをdict形式で取得する
    loc = {
        'bash': get_completefile_install_location('bash'),
        'zsh': get_completefile_install_location('zsh')
    }

    # 対象となるファイルをdict形式で指定
    files = dict(
        bash=['completion/hogehoge-completion.bash'],
        zsh=[
            'completion/hogehoge-completion.bash',
            'completion/_hogehoge'
        ]
    )

    # data_files形式でreturn
    data_files = []
    data_files.append((loc['bash'], files['bash']))
    data_files.append((loc['zsh'], files['zsh']))
    return data_files


if __name__ == "__main__":
    setuptools.setup(
        name='hogehoge',
        version='0.1.2',
        install_requires=[
            'hoge',
            'fuga'
        ],
        packages=setuptools.find_packages(),
        py_modules=['hoge'],
        entry_points={
            'console_scripts': [
                'hoge = hoge:main',
            ],
        },
        data_files=get_data_files(),
    )

 

これで、関数内で指定した補完ファイルがインストールされる。

 

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*