Cómo importar paquetes locales sin gopath

He usado GOPATH pero para esta corriente problema que estoy enfrentando no ayuda. Quiero ser capaz de crear los paquetes que son específicos de un proyecto:

myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go

He intentado de varias maneras pero, ¿cómo puedo obtener package1.go para trabajar en el binary1.go o la binary2.go y así sucesivamente?

Por ejemplo, quiero ser capaz de import "package1" y, a continuación, ser capaz de ejecutar go build binary1.go y todo funciona bien sin el error de ser arrojados de que el paquete no se encuentra en GOROOT o GOPATH. La razón por la que necesitamos este tipo de funcionalidad es para proyectos de gran escala; yo no quiero tener que hacer referencia a varios otros paquetes o guardarlos en un archivo de gran tamaño.

  • Se supone que tienes que poner los archivos de origen para cada uno de los binarios en su propio directorio.
  • Todos los .go archivos en un solo directorio son parte de un mismo paquete, y usted no necesita import archivos en el mismo paquete (es decir, el mismo directorio). Usted ha mencionado que trabajan fuera de GOPATH, que es una de las capacidades del nuevo sistema de módulos. Este respuesta cubre la estructura de módulo, la importación de paquetes locales, la organización de paquetes dentro de un módulo, o si no tiene varios módulos en un solo repositorio, etc.
  • Y este comportamiento es aceptar con todo el mundo? Que, básicamente, no se puede importar su local de la sub-paquetes a menos que se especifique toda la git/repo/to/my/project camino? Yo no veo la razón por la que alguien quiera tener este comportamiento. Lo que si se mueve el proyecto a otra ubicación (es decir, la ventana acoplable de la imagen), es necesario modificar todas las rutas de nuevo? Estoy buscando respuestas a por qué esto es tan complicado.
InformationsquelleAutor | 2013-07-09

5 Kommentare

  1. 164

    Ir gestión de la dependencia resumen:

    • vgo si su versión es: x >= go 1.11
    • dep o vendor si su versión es: go 1.6 >= x < go 1.11
    • Manualmente si su versión es: x < go 1.6

    Edit 3: Ir 1.11 tiene una característica vgo que reemplazar dep.

    Utilizar vgo, ver Módulos documentación. TLDR a continuación:

    export GO111MODULE=on
    go mod init
    go mod vendor # if you have vendor/folder, will automatically integrate
    go build

    Este método crea un archivo llamado go.mod en el directorio de proyectos. Usted puede construir su proyecto con go build. Si GO111MODULE=auto se establece, entonces el proyecto no puede estar en $GOPATH.


    Edit 2: El vendoring método es válido y funciona sin problema. vendor es en gran medida un proceso manual, ya que de esta dep y vgo fueron creados.


    Edit 1: Mientras mi viejo manera en que funciona ya no es la manera «correcta» de hacerlo. Usted debe estar utilizando proveedor capacidades, vgo, o dep (por ahora) que se activan por defecto en Ir 1.6; ver. Básicamente agregar su «externo» o «dependiente» de los paquetes dentro de una vendor directorio; en la compilación el compilador utilizará estos paquetes primera.


    Encontrado. Yo era capaz de importación de paquetes local con GOPATH la creación de una carpeta de package1 y entonces importando con import "./package1" en binary1.go y binary2.go scripts como este :

    binary1.ir

    ...
    import (
            "./package1"
          )
    ...

    Así que mi directorio actual estructura se parece a esto:

    myproject/
    ├── binary1.go
    ├── binary2.go
    ├── package1/
       └── package1.go
    └── package2.go

    También debo señalar que las rutas relativas (al menos en ir 1.5) también el trabajo; por ejemplo:

    import "../packageX"
    • Que funciona bien hasta que tienen dos subcarpetas con una referencia a otro. Por ejemplo, si paquete2 fue también una subcarpeta y es necesario paquete1, el sistema se rompe.
    • import "../package1"
    • Relativa a la importación caminos son una mala idea.
    • si #golang ofrece el espacio de nombres’, estoy de acuerdo con usted en que la relativa a la importación de ruta de acceso’ o ‘sub-paquetes » son malas ideas».
    • Nombre de la función debe comenzar con la palabra clave Capitilized
    • De hecho, dep no será parte de la cadena de herramientas, pero vgo será, como se puede leer en el ir [github.com/golang/go/wiki/… de la página). Es que se libera en el go v1.11, que se espera en Agosto. 2018.
    • sólo si van a ser exportados.
    • Vale la pena mirar con Reemplazar las Directivas en los módulos. Esta entrada en la Ir Módulo Wiki lo explica muy bien.

  2. 67

    No hay tal cosa como «locales » paquete». La organización de paquetes en un disco es ortogonal a cualquier padre/hijo de las relaciones de los paquetes. La única verdadera jerarquía formada por paquetes es el árbol de dependencia, que en el caso general no refleja el árbol de directorios.

    Solo uso

    import "myproject/packageN"

    y no se lucha contra el sistema de construcción por ninguna buena razón. El ahorro de una docena de caracteres por la importación, de manera no trivial programa no es una buena razón, ya que, por ejemplo, los proyectos con relación a la importación caminos no se vaya-gettable.

    El concepto de la importación de las rutas tienen algunas propiedades importantes:

    • Importar rutas pueden ser globalmente únicos.
    • En conjunción con GOPATH, ruta de importación puede ser traducido de forma inequívoca a una ruta de directorio.
    • Cualquier ruta de acceso del directorio bajo GOPATH puede ser traducido de forma inequívoca a una ruta de importación.

    Todo lo anterior, es arruinado por utilizar relativa a la importación de rutas de acceso. No lo hagas.

    PS: Hay pocos lugares en el código de la herencia en Ir compilador pruebas de que el uso relativo de las importaciones. ATM, esta es la única razón por la relación de las importaciones son compatibles en todos.

    • Recomiendo echar un vistazo a este vídeo de introducción para una mejor comprensión de paquetes y GOPATH. youtube.com/watch?v=XCsL89YtqCs
    • Creo que esto es malo aconsejar. Si usas gopkg.para el control de versiones, por ejemplo, estás de suerte, con absoluta importar rutas de acceso para el «mini» pakages, como se describió anteriormente. Ya sea que usted rompa la fuente de repos o la versión que uno se convierte en inútil.
    • import "myproject/packageN". myproject es el nombre de la carpeta que tiene mi proyecto?
    • Eso es totalmente erróneo, ¿cómo la uso privado de los repositorios ahora?
  3. 42

    Tal vez usted está tratando de modularizar de su paquete. Estoy asumiendo que package1 y package2 son, en cierto modo, parte del mismo paquete, pero para mejorar la legibilidad va a dividir en varios archivos.

    Si el caso anterior era la suya, se puede utilizar el mismo nombre de paquete en los múltiplos de los archivos y será como si no hubiera el mismo archivo.

    Este es un ejemplo:

    agregar.ir

    package math
    
    func add(n1, n2 int) int {
       return n1 + n2
    }

    restar.ir

    package math
    
    func subtract(n1, n2 int) int {
        return n1 - n2
    }

    donothing.ir

    package math
    
    func donothing(n1, n2 int) int {
        s := add(n1, n2)
        s = subtract(n1, n2)
        return s
    }

    Yo no soy un Ir experto y este es mi primer post en StackOveflow, así que si usted tiene algún consejo será bien recibido.

  4. 17

    Tengo un problema similar y la solución actualmente estoy usando usos Van 1.11 módulos. Tengo la siguiente estructura

    - projects
      - go.mod
      - go.sum
      - project1
        - main.go
      - project2
        - main.go
      - package1
        - lib.go
      - package2
        - lib.go

    Y soy capaz de importar paquete1 y paquete2 de project1 y project2 mediante

    import (
        "projects/package1"
        "projects/package2"
    )

    Después de ejecutar go mod init projects. Puedo usar go build de project1 y project2 directorios o que puedo hacer go build -o project1/exe project1/*.go desde el directorio de proyectos.

    La desventaja de este método es que todos sus proyectos terminan compartiendo la misma lista de dependencia en ir.mod. Todavía estoy buscando una solución a este problema, pero parece que podría ser fundamental.

  5. 7

    Para agregar un «local» paquete a su proyecto, agregar una carpeta (por ejemplo «nombre_paquete»). Y puesto que la implementación de los archivos en esa carpeta.

    src/github.com/GithubUser/myproject/
     ├── main.go
     └───package_name
           └── whatever_name1.go
           └── whatever_name2.go

    En su package main hacer esto:

    import "github.com/GithubUser/myproject/package_name"

    Donde package_name es el nombre de la carpeta y debe coincidir con el nombre del paquete se utiliza en archivos de whatever_name1.ir y whatever_name2.vaya. En otras palabras, todos los archivos con un sub-directorio debe estar en el mismo paquete.

    Puede nido más subdirectorios, ya que puedes especificar la ruta de acceso completa a la carpeta principal en la importación.

    • Esta es una buena sugerencia, salvo que durante el pánico de kernel el seguimiento de la pila que se vierte desde el binario se muestra la github.com ruta por ejemplo, no siempre el más deseable de comportamiento. Hay banderas de suprimir esto, pero no debería ser necesario para lograr simple paquete de organización, y he descubierto que de fallar en alguna ocasión.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea