Saltar al contenido

Cómo ver el árbol de dependencias completo para las dependencias de Go anidadas

Solución:

si lo siguiente no es un seguimiento de pila, ¿qué es?

Es la lista de la ruta en la que Go busca el paquete que falta.

No tengo idea de quién está importando kafkaAvailMonitor.go

No es “importado”, solo es parte de sus fuentes y está compilado.
Excepto que no puede compilar, porque necesita github.com/Shopify/sarama/tz/breaker, que no está en GOROOT o GOPATH.

Aún así, mira lo que go list volvería en su paquete directo, para ver si kafkaAvailMonitor es mencionado.

go list puede mostrar tanto los paquetes de los que depende directamente su paquete, como su conjunto completo de dependencias transitivas.

% go list -f '{{ .Imports }}' github.com/davecheney/profile
[io/ioutil log os os/signal path/filepath runtime runtime/pprof]
% go list -f '{{ .Deps }}' github.com/davecheney/profile
[bufio bytes errors fmt io io/ioutil log math os os/signal path/filepath reflect run

A continuación, puede escribir la lista de ir a la lista para listar todos dependencias.
Vea este script de bash, por ejemplo, de Noel Cower (nilium)

#!/usr/bin/env bash
# Usage: lsdep [PACKAGE...]
#
# Example (list github.com/foo/bar and package dir deps [the . argument])
# $ lsdep github.com/foo/bar .
#
# By default, this will list dependencies (imports), test imports, and test
# dependencies (imports made by test imports).  You can recurse further by
# setting TESTIMPORTS to an integer greater than one, or to skip test
# dependencies, set TESTIMPORTS to 0 or a negative integer.

: "${TESTIMPORTS:=1}"

lsdep_impl__ () {
    local txtestimps="{{range $v := .TestImports}}{{print . "n"}}{{end}}"
    local txdeps="{{range $v := .Deps}}{{print . "n"}}{{end}}"

    {
        go list -f "${txtestimps}${txdeps}" "[email protected]"
        if [[ -n "${TESTIMPORTS}" ]] && [[ "${TESTIMPORTS:-1}" -gt 0 ]]
        then
            go list -f "${txtestimps}" "[email protected]" |
            sort | uniq |
            comm -23 - <(go list std | sort) |
                TESTIMPORTS=$((TESTIMPORTS - 1)) xargs bash -c 'lsdep_impl__ "[email protected]"' "$0"
        fi
    } |
    sort | uniq |
    comm -23 - <(go list std | sort)
}
export -f lsdep_impl__

lsdep_impl__ "[email protected]"

Al usar módulos, es posible que pueda obtener lo que necesita de go mod graph.

usage: go mod graph

Graph prints the module requirement graph (with replacements applied)
in text form. Each line in the output has two space-separated fields: a module
and one of its requirements. Each module is identified as a string of the form
[email protected], except for the main module, which has no @version suffix.

Es decir, para la pregunta original, ejecute go mod graph | grep github.com/Shopify/sarama luego observe más de cerca cada entrada en el lado izquierdo.

La respuesta anterior todavía no me muestra un árbol de dependencia, así que me tomé el tiempo para escribir un script para hacer lo que necesito, con suerte, eso ayudará a otras personas.

El problema con la solución anterior (las otras propuestas como la lista de opciones) es que solo me dice el nivel superior. No “atraviesan el árbol”. Este es el resultado que obtengo, que no ayuda más de lo que me da go build.

.../npd/auth/
   .../mon/mlog
   .../auth/service

Esto es lo que estoy tratando de obtener: sé que la autenticación está rota (arriba) y que el disyuntor está roto (abajo) de go build, pero no tengo idea de lo que hay en el medio, mi script a continuación me da esta salida.

.../npd/auth/
    .../npd/auth/service                
        .../npd/auth/resource
            .../npd/auth/storage
               .../npd/middleware
                  .../npd/metrics/persist
                    .../npd/kafka
                        .../vendor-library/src/github.com/Shopify/sarama
                            .../vendor-library/src/github.com/Shopify/sarama/vz/breaker

Mi guion

import subprocess
import os

folder_locations=['.../go/src','.../vendor-library/src']

def getImports(_cwd):
    #When the commands were combined they overflowed the bugger and I couldn't find a workaround
    cmd1 = ["go", "list", "-f", " {{.ImportPath}}","./..."]
    cmd2 = ["go", "list", "-f", " {{.Imports}}","./..."]

    process = subprocess.Popen(' '.join(cmd1), cwd=_cwd,shell=True,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)

    out1, err = process.communicate()

    process = subprocess.Popen(' '.join(cmd2), cwd=_cwd,shell=True,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE)

    out2, err = process.communicate()
    out2clean=str(out2).replace("b'",'').replace('[','').replace(']','').replace("'",'')

    return str(out1).split('\n'),out2clean.split('\n')

def getFullPath(rel_path):
    for i in folder_locations:
        if os.path.exists(i+"https://foroayuda.es/"+rel_path):
            return i+"https://foroayuda.es/"+rel_path
    return None

def getNextImports(start,depth):

    depth=depth+1
    indent="t"*(depth+1)

    for i,val in enumerate(start.keys()):

        if depth==1:
            print (val)

        out1,out2=getImports(val)

        noDeps=True
        for j in out2[i].split(' '):
            noDeps=False

            _cwd2=getFullPath(j)
            new_tree = {_cwd2:[]}
            not_exists = (not _cwd2 in alltmp)

            if not_exists:
                print(indent+_cwd2)
                start[val].append(new_tree)
                getNextImports(new_tree,depth)
                alltmp.append(_cwd2)

        if noDeps:
            print(indent+'No deps')

_cwd = '/Users/.../npd/auth'

alltmp=[]
start_root={_cwd:[]}
getNextImports(start_root,0)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *