Как определить, какие зависимости загружаются?

Я использую этот код для получения списка зависимостей, импортированных в один исходный файл Go:

// GetFileImports returns all the imports from the Golang source code file.
func GetFileImports(filepath string) ([]string, error) {
    fset := token.NewFileSet()
    file, err := parser.ParseFile(fset, filepath, nil, parser.ImportsOnly)

    if err != nil {
        return nil, err
    }

    imports := make([]string, len(file.Imports))

    for i := range file.Imports {
        imports[i] = strings.Trim(file.Imports[i].Path.Value, "\"")
    }

    return imports, nil
}

Я получаю этот список:

namoled-core/data
namoled-core/shared
encoding/json
fmt
io/ioutil
log
net/http
github.com/gorilla/mux
github.com/gorilla/websocket

Где namoled-core/data и namoled-core/shared — части моего собственного проекта, github.com/gorilla/mux и github.com/gorilla/websocket — загружаемые зависимости, а все остальные — зависимости стандартной библиотеки. Существует ли надежный и недвусмысленный способ отличить зависимости от текущего проекта, загружаемых зависимостей и зависимостей стандартной библиотеки только по их путям импорта? Принимая во внимание, что путь к проекту также может быть ссылкой Github.


person zergon321    schedule 30.10.2019    source источник
comment
В общем случае пути импорта будет недостаточно, так как go.mod может содержать replace директив, и любые пакеты из вашего модуля могут быть сопоставлены с любым другим и наоборот (например, github.com/gorilla/mux может быть заменен на namoled-core/mux).   -  person icza    schedule 30.10.2019
comment
части моего собственного проекта также являются концепцией, которая существует только для людей; Сам по себе Go не имеет понятия о проекте.   -  person Adrian    schedule 30.10.2019
comment
@ Адриан, да, я это знаю, но такие вещи, как dep и Glide, каким-то образом определяют, какие зависимости загружаются и должны быть добавлены в индексные файлы.   -  person zergon321    schedule 30.10.2019


Ответы (1)


Если вы используете Go Modules, вы можете использовать содержимое файла go.sum для фильтрации загружаемых зависимостей из ответа, предоставленного вашим методом.

Изменить: следует помнить, что импорт связан с пакетами, а загружаемые зависимости связаны с модулями. Модуль состоит из нескольких пакетов, и пакеты имеют имя модуля в качестве префикса. Поэтому вам может понадобиться поискать в файле go.sum записи, которые являются префиксами для имен пакетов, возвращаемых вашим методом.

person Elio Marcolino    schedule 30.10.2019