Лучший способ использовать тестовые зависимости в Go, но не экспортировать их

Учитывая проект в Golang (1.14+), который использует тестовые зависимости (например, github.com/stretchr/testify), и теперь предполагаем, что этот проект является публичной библиотекой, которую могут использовать другие.

Обычно, когда я сейчас использую go mod graph, я всегда вижу эту зависимость, например:

github.com/its-me/[email protected]
github.com/stretchr/[email protected] github.com/davecgh/[email protected]
github.com/stretchr/[email protected] github.com/pmezard/[email protected]
github.com/stretchr/[email protected] github.com/stretchr/[email protected]
github.com/stretchr/[email protected] gopkg.in/[email protected]
gopkg.in/[email protected] gopkg.in/[email protected]

go mod tidy или go mod download, похоже, также загружают все тестовые зависимости из используемой библиотеки. Но вместо того, чтобы говорить всем использовать exclude в своих go.mod файлах, есть ли способ предотвратить его экспорт?


person GreNodge    schedule 25.09.2020    source источник
comment
Нет разницы между тестовой зависимостью и зависимостью. Также зависимости не экспортируются. Какую проблему вы пытаетесь решить и в чем суть вопроса?   -  person Volker    schedule 26.09.2020
comment
Если это раздражает, переместите все _test.go в другой пакет, запустите оттуда проверки.   -  person colm.anseo    schedule 26.09.2020
comment
@Volker Пока я предполагал, что разницы нет (следуя документации), но надежда умирает последней. Я хочу уменьшить количество материалов, которые нужно загружать людям, используя публичную библиотеку. Меня (для себя) очень часто раздражают библиотеки, в которых мне нужно сначала загрузить (например, go mod tidy) некоторые тестовые зависимости, которые я не использую и не хочу использовать.   -  person GreNodge    schedule 26.09.2020
comment
@ colm.anseo ваш подход не сексуален, но звучит правдоподобно и пока что лучший вариант.   -  person GreNodge    schedule 26.09.2020
comment
@GreNodge Вы нашли решение этой проблемы? Я тоже сталкиваюсь с тем же.   -  person Kishan B    schedule 08.02.2021
comment
@KishanB К сожалению, пока нет. Как уже писали ранее: я стараюсь с этим жить. : - /   -  person GreNodge    schedule 09.02.2021


Ответы (1)


go mod tidy предназначен для предоставления всех зависимостей, необходимых для запуска go test all. Обратите внимание, что в Go 1.16 go test all будет несколько менее агрессивно относиться к транзитивным зависимостям тестов (https://tip.golang.org/doc/go1.16#all-pattern).

Однако, если ваш собственный тест использует testify, то пользователям вашего пакета потребуется загрузить testify, чтобы запустить go test all в своем собственном модуле.

(Как отмечает colm.anseo, если вы хотите, вы можете разделить более тяжелые тесты в отдельный пакет, чтобы, когда ваши пользователи запускают go test all, они не будут запускать эти тесты и им не нужно будет загружать исходный код для этих зависимостей.)

На данный момент пользователи вашего модуля в любом случае загрузят go.mod файл для модуля testify: транзитивные зависимости модуля должны быть согласованными. Планируемая функция, «ленивая загрузка», сделает так, что даже файлы go.mod больше не нужны для транзитивных зависимостей в противном случае неактуальных модулей (см. https://golang.org/issue/36460 для подробностей).

person bcmills    schedule 12.02.2021