命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術についてのメモ。

Windowsのpython開発で仮想環境(venv)・VSCode向けの設定・.gitignoreをセットアップしてすぐ開発できるようにするスクリプトを書いてみた

最近プライベートで勉強を兼ねてpythonで1つのツールを開発しています。

普段デスクトップで開発をしているのですが、外出先でも開発できるようにノートPCも使うようになりました。

新しい環境で開発を開始するとき、仮想環境と設定といろいろと面倒なことがあったので新しい環境下で利用できるスクリプトを書いてみました。

前提とする環境

セットアップの内容

  • venvの仮想環境作成
  • pipのアップデート
  • requirements.txt に合わせたパッケージインストール
  • ワークスペースに合わせたVSCode設定作成
    • pythonインタープリターのパスを仮想環境のpython.exeに設定
    • pythonのパッケージのパスを設定
    • リント設定: flake8
    • フォーマット: 保存・コピペ時実行
    • .gitignore に仮想環境を追加

ソースコード

param ([string]$EnvName)
<#
    .SYNOPSIS
    python開発環境のセットアップ。

    .DESCRIPTION
    - pythonのvenvによる仮想環境を構築する。
    - requirements.txtが存在すればプロジェクトに必要なパッケージをインストールする。
    - VSCodeの開発用設定ファイルを作成する。

    .PARAMETER EnvName
    設定する環境名

    .EXAMPLE
    PS> SetupPythonDevEnv.ps1 -EnvName .appenv
#>

Set-Location -Path $PSScriptRoot

if (-not $EnvName) {
    Write-Host "環境名を設定してください。"
    exit
}

$IsFirstRun = -not (Test-Path -Path "$PSScriptRoot\$EnvName")

if (-not $IsFirstRun) {
    Write-Host "指定の環境名フォルダがすでに存在しています。セットアップを中止します。"
    Write-Host "セットアップを再度実行したい場合は仮想環境フォルダを削除してから再度実行してください。:$EnvName"
    exit 
}
Write-Host "[venv]環境の作成:$EnvName"
python -m venv $EnvName

Write-Host "[venv]環境の有効化 $EnvName"
& "$EnvName\Scripts\Activate.ps1"

Write-Host @"
[venv]環境を有効化しました。現在のコマンドを表示します。
- python : $((Get-Command python).Source)
- pip    : $((Get-Command pip).Source)
"@
Write-Host "[pip]pipのアップデート"
python -m pip install --upgrade pip

if (Test-Path "$PSScriptRoot\requirements.txt") {
    Write-Host "[pip]パッケージのインストール"
    pip install -r $PSScriptRoot\requirements.txt
}

Write-Host "[VSCode]ワークスペース用settings.json作成"
$vscodeDir = ".vscode"
if (-not (Test-Path $vscodeDir)) {
    mkdir $vscodeDir
}
$ScriptRootJson = $PSScriptRoot -replace "\\", "\\"
$json = @"
{
    "python.defaultInterpreterPath": "$ScriptRootJson\\$EnvName\\scripts\\python.exe",
    "python.analysis.extraPaths": [
        "$ScriptRootJson\\$EnvName\\Lib\\site-packages"
    ],
    "python.autoComplete.extraPaths": [
        "$ScriptRootJson\\$EnvName\\Lib\\site-packages"
    ],
    "files.watcherExclude": {
        "**\\$EnvName\\**": true
    },
    "python.linting.enabled": true,
    "python.linting.flake8Enabled": true,
    "python.linting.pycodestyleEnabled": false,
    "python.linting.pylintEnabled": false,
    "python.formatting.provider": "autopep8",
    "[python]": {
        "editor.formatOnSave": true,
        "editor.formatOnPaste": true
    }
}
"@
Set-Content -Path "$vscodeDir\settings.json" -Value $json -Encoding UTF8

# .gitignoreの設定
$GitIgnoreFile = ".gitignore"
if (Test-Path $GitIgnoreFile) {
    $HasEnvName = Get-Content $GitIgnoreFile -Encoding UTF8 `
        | Where-Object { $_ -eq $EnvName }
    if ($HasEnvName) {
        Write-Host "[git].gitignoreに追加済"
    }
    else {
        $IgnoreDirectory = "`n`n# python venv $EnvName`n$EnvName"
        
        Write-Host "[git].gitignoreに仮想環境を追記"
        Add-Content -Path ".gitignore" -Value $IgnoreDirectory -Encoding UTF8
    }
}

気になるところ

  • すでに .vscode/settings.json が存在したときにマージできない。
    • powershellで既存json編集が面倒なので妥協した
    • 統一した環境でチーム開発するなら問題ない?
  • いくつかの設定を関数化したほうがいい?

以上