めあて
Pythonを中心としたVSCodeでのプログラミングの環境としてWSLが便利だと思っています。
- Windowsホストにpythonなどの環境をセットアップすると、Windows版特有のノウハウが必要だったり、 バージョンを柔軟に変更できなかったり、環境をあれこれ変えるとWindowsホストの環境が汚れる感じがして気持ち悪かったりする。
- 逆に、WSLだと(普通に?)Linuxの環境として使用できるし、仮想環境なので、同時に、いくつも環境を作成して使用できる。間違えたり、いらなくなったら、きれいさっぱりと削除できる。
- WSLにdockerをインストールして、Dev Container方式の環境にすることもできるけど、いろいろと実験しながらプログラミングするには、コンテナ化するより、WSLディストリビューションの環境くらいが丁度よい。
WSLのメリット(環境を複数作れる、作り直せる)を活用するため、環境のセットアップはIaCっぽくして、再実施を簡単にしたり、再現性を持たせることで、他の人に共有したり、という感じにしたくなります。
セットアップ手順をshファイルにまとめる方式
こんな感じでshファイルにまとめておけば、再実施の手順も1ファイルにまとまるし、shファイルなのでコードっぽくなってよさそう。
DebianDev.sh
# ディストリビューションのデータフォルダを配置する場所に
# 移動し、このshファイルを配置し、
# PowerShellで下記のコマンドを順次実行すれば、セットアップ完了
#
# Invoke-WebRequest -Uri "https://salsa.debian.org/debian/WSL/-/raw/master/x64/install.tar.gz" -OutFile "install.tar.gz"
# wsl --import DebianDev DebianDev install.tar.gz
# wsl -d DebianDev -u root -- bash -e -x DebianDev.sh
#
echo "[general]" >> /etc/wsl.conf
echo "guiApplications=false" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[automount]" >> /etc/wsl.conf
echo "enabled=true" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[interop]" >> /etc/wsl.conf
echo "enabled=false" >> /etc/wsl.conf
echo "appendWindowsPath=false" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[user]" >> /etc/wsl.conf
echo "default=foo" >> /etc/wsl.conf
echo "" >> /etc/wsl.conf
echo "[boot]" >> /etc/wsl.conf
echo "command=" >> /etc/wsl.conf
adduser --disabled-password --gecos "" foo
passwd --delete foo
usermod -aG sudo foo
apt update
apt -y upgrade
# python
apt -y install python3 python-is-python3 python3-pip python3-poetry
# docker
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable' | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
usermod -aG docker foo
#################################################################
# 予備のpyenvとかnodejsをセットアップする手順
#
# apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev git
# git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# echo 'export PYENV_ROOT="\$HOME/.pyenv"' >> ~/.bashrc
# echo 'command -v pyenv >/dev/null || export PATH="\$PYENV_ROOT/bin:\$PATH"' >> ~/.bashrc
# echo 'eval "\$(pyenv init -)"' >> ~/.bashrc
# /home/foo/.pyenv/bin/pyenv install 3.11.9
# curl -sSL https://install.python-poetry.org | python3 -
# echo 'export PATH="/home/foo/.local/bin:\$PATH"' >> ~/.bashrc
# /home/foo/.pyenv/bin/pyenv global 3.11.9
#
# curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
# apt-get install -y nodejs
# npm install --global yarn
#
#################################################################
全部PowerShellでやる方式(上記のsh方式のほうが推奨)
下記コードは、WSL環境を新しく作成し、セットアップを行う過程をすべてPowerShellコマンド化して、一気に実行できるようにした例です。ターミナルでコピーペーストで実行するんですが、たまに失敗したりで、安定性はいまいちです。
PowerShell
Invoke-WebRequest -Uri "https://salsa.debian.org/debian/WSL/-/raw/master/x64/install.tar.gz" -OutFile "install.tar.gz"
wsl --import debi debi install.tar.gz
wsl -d debi -u root -- adduser --disabled-password --gecos \"\" foo
wsl -d debi -u root -- passwd --delete foo
wsl -d debi -u root -- usermod -aG sudo foo
wsl -d debi -u root -- apt update `&`& apt upgrade -y
wsl -d debi -u root -- echo "[general]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "guiApplications=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[automount]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "enabled=true" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[interop]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "enabled=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "appendWindowsPath=false" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[user]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "default=foo" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "[boot]" `>`> /etc/wsl.conf
wsl -d debi -u root -- echo "command=" `>`> /etc/wsl.conf
## python3
wsl -d debi -u root -- apt install -y gcc make build-essential libssl-dev libffi-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev liblzma-dev git
wsl -d debi -u foo -- git clone https://github.com/pyenv/pyenv.git ~/.pyenv
wsl -d debi -u foo -- echo 'export PYENV_ROOT=\"\$HOME/.pyenv\"' `>`> ~/.bashrc
wsl -d debi -u foo -- echo 'command -v pyenv >/dev/null || export PATH=\"\$PYENV_ROOT/bin:\$PATH\"' `>`> ~/.bashrc
wsl -d debi -u foo -- echo 'eval \"\$(pyenv init -)\"' `>`> ~/.bashrc
wsl -d debi -u foo -- /home/foo/.pyenv/bin/pyenv install 3.11.9
wsl -d debi -u foo -- curl -sSL https://install.python-poetry.org `| python3 -
wsl -d debi -u foo -- echo 'export PATH="/home/foo/.local/bin:\$PATH"' `>`> ~/.bashrc
wsl -d debi -u foo -- /home/foo/.pyenv/bin/pyenv global 3.11.9
## docker
wsl -d debi -u root -- apt install -y ca-certificates curl gnupg lsb-release
wsl -d debi -u root -- curl -fsSL https://download.docker.com/linux/debian/gpg `| gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
wsl -d debi -u root -- echo 'deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable' `| tee /etc/apt/sources.list.d/docker.list `> /dev/null
wsl -d debi -u root -- apt update `&`& apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
wsl -d debi -u root -- update-alternatives --set iptables /usr/sbin/iptables-legacy
wsl -d debi -u root -- update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
wsl -d debi -u root -- usermod -aG docker foo
## nodejs
wsl -d debi -u root -- curl -fsSL https://deb.nodesource.com/setup_20.x `| bash - `&`& apt-get install -y nodejs
wsl -d debi -u root -- npm install --global yarn
wsl --shutdown debi