電波ビーチ

☆(ゝω・)v

WSL2で雑にgoのweb開発環境

ゴール

wsl側で起動したgoのwebサーバーに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

今回目指すディレクトリ構造

なんもわからんのでこちらの記事を参考にする。

zenn.dev

以下のsandboxwebが記事内のmyapp-1myapp-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環境ではそうはいかない

zenn.dev

しょうがないので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をいじる必要がある。

yukituna.com

C:\Users\<username>\.wslconfigを作って書く。いろいろ設定項目があるが今回はこれだけ

[wsl2]
localhostForwarding=true

これでwsl2を再起動&&再ログインし、main.goをたたくと、windowsのブラウザでアクセスできた。

~/go/PROJECTNAME$ go run web/main.go 
# ブラウザでlocalhost:1270にアクセスするとhtmlが表示される

あとは雑にやっていきましょう