Пакеты и модули
От: 00011011  
Дата: 06.04.22 18:39
Оценка:
Скачал с гитхаба несколько интересующих меня проектов, изучаю код.
В проекте несколько "пакетов" — т.е. папок, в каждой папке-пакете несколько файлов, в начале каждого файла — инструкция package имя_пакета, где имя_пакета совпадает с именем папки. Ну допустим это так принято.
В секциях import подключаются пакеты — встроенные в Go и какие-то с гитхаба. И вот что непонятно

1. Прежде всего, мне попадается довольно много проектов, в которых наподключена куча всего с гитхаба. Это теперь так принято — доверять непойми чьему коду? Я понимаю в С++ существуют некие общепринятые библиотеки типа Буста, да и то во многих случаях их стараются избегать. А в Go другая философия? Есть ли хотя-бы какие-то "курируемые списки" хороших библиотек (желательно курируемые самими разработчиками языка)?

2. Самое главное что непонятно — пути к собственным пакетам (т.е. тем, код которых включен в проект и написан тем же автором) тоже организованы через гитхаб.
В результате go, вместо того чтобы использовать локальные исходники, которые лежат тут же рядом, скачивает их с гитхаба, кладет в какую-то мутную папку вида c:/Users/<username>/go/pkg/mod, и компилирует оттуда.
Вот сейчас прошелся по всем исходникам проекта и заменил пути вида github.com/UserName/RepoName/PackageName на ModuleName/PackageName, где ModuleName — это просто имя моего проекта, указанное в go.mod. И все компилируется, но теперь (как я понимаю) исходники пакетов будут браться локально, и я смогу исправлять их также локально вместе с исходниками главного (исполняемого) пакета.

Прав ли я? И если да, то как предполагается работать над кодом библиотек, если бы я такое не сделал — постоянно синхронизировать с гитхабом перед компиляцией? (но в такое я как-то совсем не верю). Или эти пакеты как-то синхронизировались бы локально сами (между рабочей папкой и той что на c:/users)? Или я вообще чего-то здесь не понимаю.

Мне вообще нравится концепция, когда исходники полностью самодостаточны и полностью компилируются на машине без интернета. Но здесь похоже все наоборот...
Re: Пакеты и модули
От: vsb Казахстан  
Дата: 06.04.22 18:48
Оценка:
Здравствуйте, 00011011, Вы писали:

0>1. Прежде всего, мне попадается довольно много проектов, в которых наподключена куча всего с гитхаба. Это теперь так принято — доверять непойми чьему коду?


Да.

> Есть ли хотя-бы какие-то "курируемые списки" хороших библиотек (желательно курируемые самими разработчиками языка)?


Нет. Можешь смотреть на число звёздочек на гитхабе

0>Мне вообще нравится концепция, когда исходники полностью самодостаточны и полностью компилируются на машине без интернета. Но здесь похоже все наоборот...


Запусти go mod vendor и все зависимости скачаются в папку vendor
Re[2]: Пакеты и модули
От: 00011011  
Дата: 06.04.22 19:05
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Запусти go mod vendor и все зависимости скачаются в папку vendor


Так если часть зависимостей уже скачалась вместе с исходниками?
Их проще удалить чтобы не путаться?
Или это особенности мышления автора проекта, который сделал отдельными пакетами "controllers", "models", "helpers" и тому подобное, и зачем-то прописал к ним пути через гитхаб, хотя все это просто лежит в папочках рядом с main.go? Я вот этого не понимаю...
Re[2]: Пакеты и модули
От: flаt  
Дата: 06.04.22 19:35
Оценка:
Здравствуйте, vsb, Вы писали:



>> Есть ли хотя-бы какие-то "курируемые списки" хороших библиотек (желательно курируемые самими разработчиками языка)?


vsb>Нет. Можешь смотреть на число звёздочек на гитхабе


Справедливости ради, есть курируемые списки в awesome-go.
Отредактировано 08.04.2022 20:20 flаt . Предыдущая версия .
Re[3]: Пакеты и модули
От: vsb Казахстан  
Дата: 06.04.22 20:44
Оценка:
Здравствуйте, 00011011, Вы писали:

vsb>>Запусти go mod vendor и все зависимости скачаются в папку vendor


0>Так если часть зависимостей уже скачалась вместе с исходниками?

0>Их проще удалить чтобы не путаться?
0>Или это особенности мышления автора проекта, который сделал отдельными пакетами "controllers", "models", "helpers" и тому подобное, и зачем-то прописал к ним пути через гитхаб, хотя все это просто лежит в папочках рядом с main.go? Я вот этого не понимаю...

Я честно говоря не очень в курсе, но таких проблем, которые ты описываешь, не испытывал.

На всякий случай посоветую ознакомиться с go modules. Раньше немного по-другому было.
Re[3]: Пакеты и модули
От: Doom100500 Израиль  
Дата: 07.04.22 05:48
Оценка:
Здравствуйте, 00011011, Вы писали:

0>Или это особенности мышления автора проекта, который сделал отдельными пакетами "controllers", "models", "helpers" и тому подобное, и зачем-то прописал к ним пути через гитхаб, хотя все это просто лежит в папочках рядом с main.go? Я вот этого не понимаю...



Нет, не так.

Вот есть у тебя модуль (см. проект — отдельная независимая сущность). У неё есть название, задаётся при старте написания этого модуля командой

go mod init <module_name>.


module_name может быть любым (от слова вообще), но если планируется хранить исходники на гитхабе, то это будет github.com/UserName/RepoName/PackageName.

У модуля, естественно будут появляться подмодули, соответственно в поддиректориях., чтобы их импортировать, нужно указывать полный путь до подмодуля, включая module_name. То, что module_name имеет формат <путь до github>, не означает, что он должен синхронизироваться через github.

Внешние для модуля зависимости будут скачиваться в тайную директорию гошки, но их можно скопировать к себе в проект командой go mod vendor.

Дело в том, что go get работает через git, и, чтобы иметь свои общие модули, которые хочется импортировать в свои — же разные проекты, то их называют именем пути к репозиторию. Это хорошо работает с github, а вот, например, с gitlab, с его группами и подгруппами, уже нет.

Я в своих игрушках общий код вообще оформляю в виде репозиториев с только .go файлами (не модули), и подключаю через git submodules.
Спасибо за внимание
Отредактировано 07.04.2022 6:20 Doom100500 . Предыдущая версия .
Re[4]: Пакеты и модули
От: 00011011  
Дата: 07.04.22 20:37
Оценка:
Здравствуйте, Doom100500, Вы писали:

D>module_name может быть любым (от слова вообще), но если планируется хранить исходники на гитхабе, то это будет github.com/UserName/RepoName/PackageName.


D>У модуля, естественно будут появляться подмодули, соответственно в поддиректориях., чтобы их импортировать, нужно указывать полный путь до подмодуля, включая module_name. То, что module_name имеет формат <путь до github>, не означает, что он должен синхронизироваться через github.


Я вот чего не понимаю.
Берем несколько примеров на гитхабе. Например:

https://github.com/AbdulwahabNour/photogallery
https://github.com/gildasch/upspin-photogallery

Смотрим у них main.go

import (
    "log"
    "net/http"

    "github.com/AbdulwahabNour/photogallery/views" //<<< это часть проекта!
    "github.com/gorilla/mux"
)

import (
    "fmt"
    "io"
    "net/http"
    "os"

    "github.com/gildasch/upspin-photogallery/collection" //<<< это часть проекта!
    "github.com/gildasch/upspin-photogallery/files" //<<< это часть проекта!
    "github.com/gin-gonic/gin"
    "upspin.io/client"
    "upspin.io/config"
    _ "upspin.io/transports"
)


При попытке сделать go build компилятор ругается и предлагает сделать go get недостающих пакетов, в том числе и тех, которые фактически являются частью проекта, и исходники которых уже скачаны из репозитория вместе с другим кодом проекта.
Что нужно сделать чтобы go build ругался только на то, что действительно внешнее? Например github.com/gorilla/mux — это действительно внешний модуль. Его нет в скачанных исходниках. А вот github.com/AbdulwahabNour/photogallery/views — это на самом деле просто папка "views" рядом с main.go
Re[5]: Пакеты и модули
От: vsb Казахстан  
Дата: 07.04.22 20:48
Оценка: 2 (1)
Здравствуйте, 00011011, Вы писали:

0>https://github.com/AbdulwahabNour/photogallery

0>https://github.com/gildasch/upspin-photogallery

Это кривые проекты. Их авторы забыли добавить файл go.mod и некоторые другие. Напиши go mod init github.com/AbdulwahabNour/photogallery в каталоге с проектом, потом go get && go build.
Re[5]: Пакеты и модули
От: Doom100500 Израиль  
Дата: 08.04.22 13:27
Оценка: 7 (2)
Здравствуйте, 00011011, Вы писали:

0>Здравствуйте, Doom100500, Вы писали:


0>https://github.com/AbdulwahabNour/photogallery

0>https://github.com/gildasch/upspin-photogallery

В до-модульные времена (когда не изобрели go mod), все исходники на go должны были лежать в GOPATH, там строилась файловая система из путей к репозиториям и проектам. И нет никаких mod директорий — всё лежит в GOPATH — и свои и внешние зависимости.
ЕМНИП, начиная с версии 1.11, этот беспредел прекратился, и стало можно создавать проекты в любом месте — это и есть go modules.

Чтобы добиться нужного поведения существуют переменные окружения и параметры командной строки .

Поэтому, когда будешь смотреть старые проекты могут выскакивать ошибки, упоминающие GOPATH, и т.д. (если в корне проекта нет go.mod и go.sum).
Тогда, если хочешь извратиться, то можешь настроить окружение для работы с GOPATH или попробовать сконвертировать их модули.

Сейчас GOPATH считается анахронизмом, но некоторые продолжают...
Спасибо за внимание
Re: Пакеты и модули
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.04.22 15:42
Оценка: 2 (1)
Здравствуйте, 00011011, Вы писали:

0>1. Прежде всего, мне попадается довольно много проектов, в которых наподключена куча всего с гитхаба. Это теперь так принято — доверять непойми чьему коду? Я понимаю в С++ существуют некие общепринятые библиотеки типа Буста, да и то во многих случаях их стараются избегать. А в Go другая философия? Есть ли хотя-бы какие-то "курируемые списки" хороших библиотек (желательно курируемые самими разработчиками языка)?


Ну вообще, конечно, принято смотреть, что включаешь. Смотреть, кто этим пакетом уже пользуется, кто автор, как развивается проект, не забросили ли его 10 лет назад.

Go гарантирует, что после того, как пакет подсосется первый раз, go.sum будет соответствующим образом обновлен (его надо хранить вместе с исходниками в репозитории), и в следующий раз будет использоваться ровно та же версия сторонних исходников.

0>2. Самое главное что непонятно — пути к собственным пакетам (т.е. тем, код которых включен в проект и написан тем же автором) тоже организованы через гитхаб.

0>В результате go, вместо того чтобы использовать локальные исходники, которые лежат тут же рядом, скачивает их с гитхаба, кладет в какую-то мутную папку вида c:/Users/&lt;username&gt;/go/pkg/mod, и компилирует оттуда.

Это у тебя твой собственный модуль как-то неправильно назван в go.mod. Если его имя совпадает с гитхабовским путем, то он будет браться из локальных исходников.

Ну и никто тебя не заставляет твой собственный код выкладывать на гитхаб и называть модуль гитхабовским путем. В этом есть смысл только, если ты естественным путем используешь гитхаб в разработке.

0>Мне вообще нравится концепция, когда исходники полностью самодостаточны и полностью компилируются на машине без интернета. Но здесь похоже все наоборот...


После первой загрузки все абсолютно самодостаточно.
Re[6]: Пакеты и модули
От: 00011011  
Дата: 08.04.22 21:05
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Это кривые проекты. Их авторы забыли добавить файл go.mod и некоторые другие. Напиши go mod init github.com/AbdulwahabNour/photogallery в каталоге с проектом, потом go get && go build.


Спасибо, вот теперь я понял — нужно в go.mod прописать название текущего проекта в том виде, как оно используется в секции import.
Т.е. с "github.com" и прочим.
Re[2]: Пакеты и модули
От: danilla  
Дата: 16.06.22 10:24
Оценка:
Здравствуйте, vsb, Вы писали:



>> Есть ли хотя-бы какие-то "курируемые списки" хороших библиотек (желательно курируемые самими разработчиками языка)?


vsb>Нет. Можешь смотреть на число звёздочек на гитхабе



Я мечтаю найти такой список, где на каждую определенную задачу рекомендуется пара-тройка проверенных, надежных библиотек, не больше. А то смотришь awesome go, и офигиваешь от разнообразия.
Re: Пакеты и модули
От: Sheridan Россия  
Дата: 23.06.22 05:24
Оценка: +1
Здравствуйте, 00011011, Вы писали:

0>1. Прежде всего, мне попадается довольно много проектов, в которых наподключена куча всего с гитхаба. Это теперь так принято — доверять непойми чьему коду?

Сейчас принято у молодёжи х..к-х..к-продакшн. Да и у поклонников Истинного Слова Бизнеса тоже.
Общая идея: "Зачем думать? Есть же чейто код, который вроде работает."
Некоторые пытаются думать, но это единицы.
Matrix has you...
Re[3]: Пакеты и модули
От: Sheridan Россия  
Дата: 23.06.22 05:30
Оценка:
Здравствуйте, danilla, Вы писали:

D>Я мечтаю найти такой список, где на каждую определенную задачу рекомендуется пара-тройка проверенных, надежных библиотек, не больше. А то смотришь awesome go, и офигиваешь от разнообразия.

Скоро будет как с node modules. Числа об библиотеки складывать начнут
Matrix has you...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.