Docker和VS Code的Go開發(fā)環(huán)境

上次我創(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)境。

感謝微軟的這一救命功能!

您可以在此處查看我為本文撰寫的源代碼。

翻譯自:https://medium.com/better-programming/a-complete-go-development-environment-with-docker-and-vscode-a3e4410d27f7

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容