ゴール
wsl側で起動したgoのwebサーバーにwindows側のlocalhostでアクセスするまでやるよ
- ゴール
- WSL2
- update, upgrade
- 今回目指すディレクトリ構造
- goのインストール
- PATHを通す
- プロジェクト作成
- wslで起動したサーバーにwindows側でlocalhostでアクセスする
goは最新の18.2
WSL2
インストール済とする.。ディストリビューションはDebian
ディストリビューションを指定して起動するには以下
wsl -d <Distribution Name>
ちなみに、sudo
するときにrootのパスワード忘れてて焦ったのでユーザー指定してwslにログインするコマンドをおいておく。パスワード変更はpasswd
でふつうにできる
wsl -u <User Name>
update, upgrade
なにはともあれ
sudo apt update sudo apt upgrade sudo apt install build-essential
今回目指すディレクトリ構造
なんもわからんのでこちらの記事を参考にする。
以下のsandbox
やweb
が記事内のmyapp-1
やmyapp-2
に相当する感じ。ただしそのほかのすべては開発していくにつれて作っていくやつ。今回は手を付けないです
~/go/PROJECTNAME$ tree . ├── env.go ├── go.mod ├── sandbox │ └── main.go └── web ├── app │ ├── controllers │ │ ├── route_main.go <- 今回使うやつ │ │ └── server.go <- 今回使うやつ │ ├── models │ └── views │ └── templates │ └── top.html <- 今回使うやつ ├── main.go <- 今回使うやつ └── utils └── logging.go
goのインストール
golangを落としてきて、展開して、/usr/local/
に入れる。PATHを通して使えるようにする。
wget https://go.dev/dl/go1.18.2.linux-amd64.tar.gz tar -C /usr/local/ -xzf go1.18.2.linux-amd64.tar.gz
PATHを通す
WSL2だとecho $PATH
をしてみるとわかるがwindows側のPATHも引き継いでいる。これが非常にわかりにくいのでまずはwidows側のPATHは無視するように設定する。
/etc/wsl.conf
で行う。今回の環境の場合は無かったので作った
[interop] appendWindowsPath = false
このappendWindowsPath
は、wsl.conf
がなくてもデフォルトでtrueになっている。これを明示的にオフってやる。
次に、PATHを通す。/.bash_profile
が無かったので作成した
export PATH=$PATH:/usr/local/go/bin
で、これでいつもならsource
とか新しくターミナルを起動するとかでいいのだが、WSL2環境ではそうはいかない
しょうがないのでWSLを再起動した。一度exit
し、Powershell(とかWindows Terminal)から
wsl -l --running # wslで起動しているディストリビューションの確認 wsl --shutdown # wslをシャットダウン
再度起動してログインしたらちゃんとPATHが通っていた
$ go version go version go1.18.2 linux/amd64
プロジェクト作成
さっき書いたみたいな構造で作る。
web/main.go
package main import ( "PROJECTNAME/web/app/controllers" ) func main(){ controllers.StartMainServer() }
web/app/controllers/server.go
package controllers import ( "net/http" ) func StartMainServer()error{ http.HandleFunc("/", top) return http.ListenAndServe(":" + "1270", nil) }
web/app/controllers/route_main.go
package controllers import ( "html/template" "net/http" ) func top(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles("web/app/views/templates/top.html") t.Execute(w, nil) }
htmlはテキトー web/app/views/templates/top.html
<h1>わーい</h1>
wslで起動したサーバーにwindows側でlocalhostでアクセスする
windows側のブラウザでWSL2で立ち上げたサーバーにアクセスするには、WSLのグローバル設定ファイル.wslconfig
をいじる必要がある。
C:\Users\<username>\.wslconfig
を作って書く。いろいろ設定項目があるが今回はこれだけ
[wsl2] localhostForwarding=true
これでwsl2を再起動&&再ログインし、main.go
をたたくと、windowsのブラウザでアクセスできた。
~/go/PROJECTNAME$ go run web/main.go # ブラウザでlocalhost:1270にアクセスするとhtmlが表示される
あとは雑にやっていきましょう