Bắt đầu
Bootstraping một môi trường phát triển Go có thể khá đáng tiếc vì chúng ta cần phải đưa vào khá nhiều công cụ và phối hợp để có được một không gian làm việc dễ dàng làm việc, chẳng hạn như xem thay đổi và biên dịch lại tệp.
Trong bài viết này, tôi sẽ đưa các công cụ cần thiết cần thiết để phát triển Go thành một gói bằng cách xây dựng hình ảnh cơ sở Docker mà chúng ta có thể sử dụng lại cho sự phát triển trong tương lai. Những gì chúng ta cần bao gồm trong hình ảnh cơ sở là sau đây.
- Tập tin watcher Entr
- Cấu hình Git đã sử dụng SSH qua HTTPS để kéo các gói Go riêng tư
- Tập lệnh tùy chỉnh để biên dịch lại dự án của chúng tôi khi tệp thay đổi
Thêm trình xem tệp
Để bắt đầu, chúng ta sẽ bắt đầu với việc biên dịch tệp nhị phân trình xem tệp. Mục tiêu của chúng tôi là có được một môi trường hộp cát hoạt động trong khi vẫn duy trì kích thước hình ảnh nhỏ nhất có thể. Chúng tôi sẽ làm như vậy bằng cách sử dụng bản dựng nhiều tầng của docker với Alpine Linux làm hình ảnh cơ sở.
1 2 | <span class="token keyword">FROM</span> alpine <span class="token punctuation">:</span> 3.10 AS builder |
Sau đó, chúng tôi cài đặt các phụ thuộc cần thiết để biên dịch một tệp nhị phân, lấy mã nguồn và thực hiện biên dịch.
1 2 3 4 5 6 | <span class="token keyword">RUN</span> apk add <span class="token punctuation">-</span> <span class="token punctuation">-</span> no <span class="token punctuation">-</span> cache curl g++ make <span class="token keyword">RUN</span> curl <span class="token punctuation">-</span> O http <span class="token punctuation">:</span> //eradman.com/entrproject/code/entr <span class="token punctuation">-</span> 4.3.tar.gz <span class="token keyword">RUN</span> tar <span class="token punctuation">-</span> xvf entr <span class="token punctuation">-</span> 4.3.tar.gz && cd entr <span class="token punctuation">-</span> 4.3 && curl <span class="token punctuation">-</span> O http <span class="token punctuation">:</span> //entrproject.org/patches/entr <span class="token punctuation">-</span> 3.9 <span class="token punctuation">-</span> wsl && patch <span class="token punctuation">-</span> p1 < entr <span class="token punctuation">-</span> 3.9 <span class="token punctuation">-</span> wsl && ./configure && make |
Sau đó, chúng tôi sao chép tệp nhị phân cuối cùng từ /usr/local/bin
vào giai đoạn xây dựng cuối cùng của chúng tôi, dựa trên hình ảnh docker chính thức của Go
1 2 3 4 5 6 7 8 9 | <span class="token keyword">RUN</span> mv entr /usr/local/bin <span class="token keyword">FROM</span> golang <span class="token punctuation">:</span> 1.13.5 <span class="token punctuation">-</span> alpine3.10 <span class="token keyword">ENV</span> PACKAGE= <span class="token keyword">ENV</span> MAIN_APP= <span class="token keyword">COPY</span> <span class="token punctuation">-</span> <span class="token punctuation">-</span> from=builder /usr/local/bin/entr /usr/local/bin/ |
Sau bước này, chúng ta đã sẵn sàng chuyển sang bước tiếp theo
Chơi đẹp với gói đi riêng
Bước tiếp theo là cấu hình git để có thể kéo vào gói riêng tư
1 2 3 4 5 | <span class="token keyword">RUN</span> apk add <span class="token punctuation">-</span> <span class="token punctuation">-</span> no <span class="token punctuation">-</span> cache git openssh <span class="token keyword">RUN</span> echo $ <span class="token string">'[url " <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> :"]n insteadOf = https://github.com/'</span> <span class="token punctuation">></span> <span class="token punctuation">></span> /root/.gitconfig <span class="token keyword">RUN</span> mkdir /root/.ssh && echo <span class="token string">"StrictHostKeyChecking no "</span> <span class="token punctuation">></span> /root/.ssh/config |
Dòng 2 được sử dụng để thay đổi chuyển từ sử dụng HTTPS sang SSH. Dòng 3 tắt tính năng kiểm tra máy chủ nghiêm ngặt để loại bỏ nhu cầu tương tác của người dùng khi sử dụng ssh lần đầu tiên.
Thêm tập lệnh biên dịch lại tùy chỉnh
Và bước cuối cùng là viết một tập lệnh tùy chỉnh sử dụng tệp nhị phân của trình xem tệp và biên dịch lại dự án của chúng tôi sau đó có sự thay đổi mã. Chúng tôi thực hiện điều đó bằng cách sử dụng shell script, làm cho nó có thể thực thi được và chuyển nó đến đường dẫn nhị phân cục bộ có tên watch
.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="token keyword">RUN</span> mkdir <span class="token punctuation">-</span> p /app/bin <span class="token keyword">RUN</span> echo $ <span class="token string">'#!/bin/shn pkill $MAIN_APP && echo "Killing process..."n rm -r /app/bin/$MAIN_APP && echo "Removing old binary..."n echo "Restarting a new process"n cd /app && go build -o /app/bin/$MAIN_APP $PACKAGE/cmd/$MAIN_APPn /app/bin/$MAIN_APP'</span> <span class="token punctuation">></span> /usr/local/bin/compile <span class="token keyword">RUN</span> chmod +x /usr/local/bin/compile <span class="token keyword">RUN</span> echo $ <span class="token string">'#!/bin/shn find . -path ./vendor -prune -o -type f ( -name "*.go" -o -name "*.yml" ) | entr -r compile'</span> <span class="token punctuation">></span> /usr/local/bin/watch <span class="token keyword">RUN</span> chmod +x /usr/local/bin/watch |
Đó là một hình ảnh hoàn chỉnh và cuối cùng cụ thể cho việc phát triển cờ vây. Để sử dụng nó cho dự án của bạn, bạn chỉ cần xây dựng nó và xuất bản nó lên kho lưu trữ docker của bạn, sau đó viết một Dockerfile và mở rộng nó khi cần trong dự án của bạn. Ví dụ
1 2 3 4 5 6 7 | <span class="token keyword">FROM</span> <span class="token punctuation">{</span> your <span class="token punctuation">-</span> docker <span class="token punctuation">-</span> image <span class="token punctuation">-</span> name <span class="token punctuation">}</span> <span class="token keyword">ENV</span> PACKAGE= <span class="token punctuation">{</span> pull/package/url <span class="token punctuation">}</span> <span class="token keyword">ENV</span> MAIN_APP= <span class="token punctuation">{</span> path/to/go/main/entrypoint <span class="token punctuation">}</span> <span class="token keyword">ENTRYPOINT</span> <span class="token punctuation">[</span> <span class="token string">"watc"</span> <span class="token punctuation">]</span> |