Проблема
Использование адреса git-хостинга в качестве импорта создаёт связанность кода с провайдером. Если переместить репозиторий с GitHub на GitLab, придётся изменить весь код — иначе будут подтягиваться старые версии. Результат — переход на другой хостинг становится столь затратным, что команды практически не меняют провайдера. Код оказывается привязан к GitHub, хотя звучит это абсурдно, но в Go-сообществе такая практика стала de facto стандартом.
Проблема стала настолько острой для одной компании, что они одновременно использовали GitLab, GitHub и Azure DevOps просто потому, что перемещение кода было слишком затратно. Времени на миграцию "не было", поэтому проще было платить за три хостинга сразу. Именно это стало причиной, по которой были разработаны инструменты для репликации кода между несколькими платформами одновременно. Проблема буквально обошлась компании в деньги.
Решение
Решение — использовать собственные домены: go.iain.rocks, go.uber.org, go.mongodb.org и подобные. Это позволяет просто изменить, на что указывают эти домены. Например, go.iain.rocks/boneclone указывает на github.com/thetrueares/boneclone, и если переместить репозиторий на GitLab, для конечных пользователей ничего не изменится — команда установки останется той же.
На мой взгляд, каждая коммерческая Go-команда должна использовать собственные домены для организации внутренних библиотек и пакетов. Это простой способ избежать ненужной привязанности к провайдеру.
Вот конфигурация для самостоятельной настройки.
nginx.conf
server {
server_name go.iain.rocks;
root /var/www/go.iain.rocks;
index index.html;
location / {
# Check if the query string does NOT contain 'go-get=1'.
# The '~' is for a case-sensitive match.
if ($args !~ go-get=1) {
# This is a human visitor. Issue a permanent redirect to GitHub.
# $request_uri will be the path, e.g., /boneclone
return 301 https://github.com/that-guy-iain$request_uri;
}
# If it's the Go tool (with ?go-get=1), serve the HTML file as before.
try_files $uri $uri/ =404;
}
# --- Your SSL configuration from Certbot should remain here ---
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/letsencrypt/live/go.iain.rocks/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/go.iain.rocks/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
# The HTTP to HTTPS redirect block should also remain.
server {
listen 80;
listen [::]:80;
server_name go.iain.rocks;
return 301 https://$host$request_uri;
}
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="go-import" content="go.iain.rocks/boneclone git https://github.com/that-guy-iain/boneclone">
<meta name="go-source" content="go.iain.rocks/boneclone https://github.com/that-guy-iain/boneclone https://github.com/that-guy-iain/boneclone/tree/master{/dir} https://github.com/that-guy-iain/boneclone/blob/master{/dir}/{file}#L{line}">
</head>
<body>
</body>
</html>