
上次我創(chuàng)建了一個(gè)簡單的腳本,啟動(dòng)了一個(gè)Docker容器,可以從我的本地機(jī)器同步和執(zhí)行Go源代碼。但我還沒有解釋如何支持IntelliSense和調(diào)試,這對(duì)開發(fā)至關(guān)重要。讓本文介紹一下。
注意事項(xiàng)
當(dāng)我研究這個(gè)目標(biāo)的解決方案時(shí),我有點(diǎn)擔(dān)心,因?yàn)樗艽蟪潭壬弦蕾囉诖a編輯器/ IDE的供應(yīng)商在容器內(nèi)工作。幸運(yùn)的是,有兩個(gè)受歡迎的編輯器支持這一點(diǎn):GoLand和VS Code。
GoLand支持看起來非常成熟,因?yàn)樗呀?jīng)存在了一段時(shí)間(源自IntelliJ)。但是,此功能僅適用于購買的版本。
VS Code Remote-Containers擴(kuò)展程序剛剛發(fā)布,因此它沒有GoLand那么成熟。盡管如此,該擴(kuò)展程序是由Microsoft(非開源)正式開發(fā)和維護(hù)的,并計(jì)劃在很多未來的服務(wù)中用作Web伴侶IDE或云IDE - 因此它非常有前途。在撰寫本文時(shí),功能集看起來也足以啟動(dòng)。我們來看看VS Code吧。
顯然,我們可以直接在容器中使用Vim并在其中安裝很棒的插件。然而,這將是我的最后一次考慮,因?yàn)槲也粌H為我而且為我的團(tuán)隊(duì)(以及你的團(tuán)隊(duì))設(shè)置了這個(gè),而且Vim的學(xué)習(xí)曲線對(duì)于大多數(shù)開發(fā)人員而言非常沉重。
VS Code遠(yuǎn)程容器
概念
VS Code Remote-Containers是一個(gè)擴(kuò)展,可以幫助開發(fā)人員正常使用他們的VSC ode UI,但所有命令和操作都在容器內(nèi)傳播和執(zhí)行。它實(shí)際上就像你是TeamViewer進(jìn)入容器并在其中使用VS Code。

VS Code的實(shí)現(xiàn)非常強(qiáng)大且抽象,大多數(shù)擴(kuò)展仍然可以正常工作。
有了這個(gè)概念,我們可以將環(huán)境容納在幾乎所有類型的開發(fā)中,而不僅僅是Go。
詳細(xì)
安裝VS Code Remote-Containers擴(kuò)展。
Dockerfile使用運(yùn)行和調(diào)試應(yīng)用程序所需的包和工具來編寫定義圖像。
.devcontainer.json在工作區(qū)根目錄(旁邊.vscode)創(chuàng)建一個(gè)引用Dockerfile。
{
"dockerFile": "Dockerfile",
"extensions": [
"ms-vscode.go"
]
}
.devcontainer.json使用VS Code 打開包含文件的文件夾。VS Code將自動(dòng)檢測它并要求您以容器模式打開項(xiàng)目。

然后,VSCode將根據(jù)您Dockerfile(僅在第一次)構(gòu)建您的圖像,并將設(shè)置一些額外的必需包,以便它可以容器化地工作。

完成此過程后,您現(xiàn)在可以正常使用VS Code,并且所有內(nèi)容都實(shí)際在容器內(nèi)運(yùn)行。

像上面的例子一樣,我甚至沒有go在本地機(jī)器上運(yùn)行,但我仍然可以從我的VS代碼執(zhí)行Go代碼,并且可以從Safari訪問服務(wù)器。一切都在容器內(nèi)完成。
實(shí)現(xiàn)
按照上面提到的概念和配方,我創(chuàng)建了一個(gè)Dockerfile。
FROM golang:1
# Configure to reduce warnings and limitations as instruction from official VSCode Remote-Containers.
# See https://code.visualstudio.com/docs/remote/containers-advanced#_reducing-dockerfile-build-warnings.
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get -y install --no-install-recommends apt-utils 2>&1
# Verify git, process tools, lsb-release (common in install instructions for CLIs) installed.
RUN apt-get -y install git iproute2 procps lsb-release
# Install Go tools.
RUN apt-get update \
# Install gocode-gomod.
&& go get -x -d github.com/stamblerre/gocode 2>&1 \
&& go build -o gocode-gomod github.com/stamblerre/gocode \
&& mv gocode-gomod $GOPATH/bin/ \
# Install other tools.
&& go get -u -v \
golang.org/x/tools/cmd/gopls \
github.com/mdempsky/gocode \
github.com/uudashr/gopkgs/cmd/gopkgs \
github.com/ramya-rao-a/go-outline \
github.com/acroca/go-symbols \
golang.org/x/tools/cmd/guru \
golang.org/x/tools/cmd/gorename \
github.com/go-delve/delve/cmd/dlv \
github.com/stamblerre/gocode \
github.com/rogpeppe/godef \
golang.org/x/tools/cmd/goimports \
golang.org/x/lint/golint 2>&1 \
# Clean up.
&& apt-get autoremove -y \
&& apt-get clean -y \
&& rm -rf /var/lib/apt/lists/*
# Revert workaround at top layer.
ENV DEBIAN_FRONTEND=dialog
# Expose service ports.
EXPOSE 8000
圖像基于官方golang圖像,因此可以go正常支持。然后我安裝了Go VS Code擴(kuò)展所需的一些工具,以便能夠?qū)崿F(xiàn)IntelliSense,linting和調(diào)試功能。
然后我寫了一個(gè).devcontainer.json文件。
{
"dockerFile": "Dockerfile",
"appPort": [
"8000:8000"
],
"extensions": [
"ms-vscode.go"
]
}
它只是引用我的Dockerfile并列出了VS Code應(yīng)該安裝到附加容器中的所有擴(kuò)展。它還設(shè)置從本地計(jì)算機(jī)到容器的端口映射,反之亦然,這樣我就可以直接從瀏覽器測試我的應(yīng)用程序。
結(jié)果
我能夠編寫具有所有IntelliSense功能的代碼,例如自動(dòng)完成,自動(dòng)導(dǎo)入,代碼導(dǎo)航等。

我能夠在本地計(jì)算機(jī)上安裝Go運(yùn)行時(shí)運(yùn)行應(yīng)用程序。感謝端口映射,我還可以從Safari測試我的應(yīng)用程序。

我能夠使用Go V SCode擴(kuò)展支持的強(qiáng)大調(diào)試功能。

限制
我?guī)缀鯎碛形倚枰囊磺? 但是,仍然有一些限制,我覺得有點(diǎn)煩人:
- 我必須解決一些問題才能使用VS Code git push命令,因?yàn)樗枰业腟SH憑據(jù)綁定到容器
- 我不能使用VS Code git commit命令GPG簽署我的提交,因?yàn)樗枰喈?dāng)多的工作才能將GPG命令從容器轉(zhuǎn)發(fā)到主機(jī)
總結(jié)
盡管仍然存在一些局限性,但我能夠解決這里定義的史詩,并擁有一個(gè)具有本地質(zhì)量開發(fā)經(jīng)驗(yàn)的全時(shí)集裝箱化開發(fā)環(huán)境。
感謝微軟的這一救命功能!
您可以在此處查看我為本文撰寫的源代碼。