2012-04-12 19 views
52

Tengo problemas para entender el flujo de trabajo para crear un proyecto go que tenga paquetes locales.Go, go get, go install, paquetes locales y control de versión

Digamos que creo un nuevo proyecto, usando git para control de versiones, que tiene un archivo main.go y un archivo tools.go que estará en utilidades de paquete. Así que tengo una estructura de directorios como el siguiente:

/myproject/ 
    main.go 
    utils/ 
    tools.go 

main.go se ve así:

package main 
import "./utils" 
func main() { 
    utils.DoSomthing() 
} 

y tools.go se parece a esto:

package utils; 
func DoSomething() { 
} 

Todo funciona muy bien localmente, usando vaya compilación y ejecute. Pero esto está alojado en github, y me gustaría que otros usen el para obtener el comando para instalarlo. Entonces, la importación del paquete local debe cambiarse para usar el formato "github.com/user/project/utils", que funciona, excepto que ahora tengo dos copias del código fuente, y el verdadero problema es que la copia con el historial de git tiene una importación que hace uso de la copia descargada. Entonces, si estoy trabajando en la copia con el historial de git, cualquier cambio realizado en tools.go pasará desapercibido, porque usará la copia descargada.

Así que me pregunto si alguien puede explicar la forma correcta de usar obtener, control de versiones, y las importaciones de paquetes dentro del mismo proyecto.

Respuesta

81

Acabo de escribir una breve guía paso a paso sobre cómo estoy usando el nuevo go tool y github.com. puede serle útil:

1. Configure su GOPATH

Puede establecer la variable de entorno GOPATH en el directorio que desee. Si tiene proyectos más grandes, probablemente sea una buena idea crear un GOPATH diferente para cada uno de ellos. Recomendaría este enfoque especialmente para la implementación, de modo que al actualizar una biblioteca para el proyecto A no se rompa el proyecto B, que podría requerir una versión anterior de la misma biblioteca.

También tenga en cuenta que puede establecer su GOPATH a una lista de directorios, delimitados por dos puntos.Por lo tanto, es posible que tenga un GOPATH que contenga todos los paquetes comúnmente utilizados, y GOPATHS por separado para cada proyecto con paquetes adicionales o versiones diferentes de paquetes existentes.

Pero a menos que esté trabajando en muchos proyectos Go diferentes simultáneamente, probablemente sea suficiente tener solo un GOPATH localmente. Por lo tanto, vamos a crear una:

mkdir $HOME/gopath 

Luego hay que establecer dos variables de entorno para contar la go tool donde puede encontrar paquetes Go existentes y donde se debe instalar otros nuevos. Probablemente sea mejor agregar las siguientes dos líneas a su ~/.bashrc o ~/.profile (y no olvide volver a cargar su .bashrc).

export GOPATH="$HOME/gopath" 
export PATH="$GOPATH/bin:$PATH" 

2. Crear un nuevo proyecto

Si desea crear un nuevo proyecto Go que debe ser alojado en github.com más tarde, se debe crear este proyecto bajo $GOPATH/src/github.com/myname/myproject. Es importante que la ruta coincida con la URL del repositorio de github.com, ya que la herramienta ir seguirá la misma convención. Por lo tanto, vamos a crear la raíz del proyecto e inicializar un nuevo repositorio git allí:

mkdir -p $GOPATH/src/github.com/myname/myproject 
cd $GOPATH/src/github.com/myname/myproject 
git init 

Debido a que no me gusta de escribir estas rutas largas, normalmente crear enlaces simbólicos para los proyectos que actualmente estoy trabajando en mi carpeta de inicio :

ln -s $GOPATH/src/github.com/myname/myproject ~/myproject 

3. Escribe tu aplicación

empezar a programar y no se olvide de git add y git commit sus archivos. Además, no utilice importaciones relativas como import "./utils" para subpaquetes. Actualmente no están documentados y no deberían utilizarse en absoluto, ya que no funcionarán con la herramienta ir. Use importaciones como github.com/myname/myproject/utils en su lugar.

4. Publique su proyecto

Crear una new repository at github.com, enviar su clave pública SSH si no lo ha hecho antes y empujar sus cambios al repositorio remoto:

git remote add origin [email protected]:myname/myproject.git 
git push origin master 

5 Continuar trabajando en su proyecto

Si ha configurado GOPATH en su .bashrc y si ha creado un enlace simbólico a su proyecto en su carpeta de inicio, puede simplemente escribir cd myproject/ y editar algunos archivos allí. Después, puede confirmar los cambios usando git commit -a y enviarlos al github.com haciendo un git push.

+3

Me he acostumbrado últimamente a esto. Lo que comencé fue tener un solo GOPATH y unir mis proyectos en ellos. De esa manera puedo construir fácilmente, pero mantener los proyectos reales en sus propios repositorios. Se siente como un enfoque bastante limpio hasta ahora. – jdi

+0

La ruta Github tiende a ser larga y soy floja, así que agregué un alias a mi bashrc: 'alias g =" cd /home/me/goroot/src/github.com/me/ "'. Ahora puedo atajar a mis proyectos con un simple comando g. –

+0

¿Cómo se hace un seguimiento de las dependencias externas que usan sus paquetes? – mohi666

10

Probablemente no desee dos copias de la fuente. Siguiendo How to Write Go Code, debe tener una ruta donde realice su desarrollo Go, digamos "godev", y debajo de eso, un directorio "src", y debajo de eso, su "github.com/user/project" y "github.com/usuario/proyecto/utils ". (Estoy de acuerdo, parece un poco rígido, pero la ventaja que se nos explica es la libertad de crear archivos). Elimine el proyecto, aquí es donde hará su trabajo.

Tendrás GOPATH establecido en godev al menos, pero es probable que desees que tu GOPATH comience con una ruta para paquetes externos que no son tuyos. Por ejemplo, el GOPATH que uso es <my place on the file system>/goext:<my place on the file system>/godev.

Tienes razón en que su importación en main.go debe ser ahora "github.com/user/project/utils.

No se preocupe por ir a buscar o cualquiera de los comandos go sobrescribir los archivos o jugar hasta control de versiones. A través de GOPATH, ven dónde estás trabajando y saben cómo funciona el control de versiones.

+0

tuve un problema relacionado, y estaba siguiendo sus directrices aquí, pero ahora estoy recibiendo un error "bucle de importación". Tengo mi fuente en \ godev \ src \ github.com \ user \ project y el proyecto importa "github.com/user/project". – Alec

+1

Su proyecto no debe tratar de importar a sí mismo. Siguiendo con el código de ejemplo anterior, su programa principal debería importar "github.com/user/project/utils". – Sonia

4

Si desea mantener su código en el repositorio de la versión local, simplemente ponga su código en GOPATH.

GOPATH acepta múltiples rutas. por ej. en Linux

GOPATH=$HOME/go:$HOME/prj/foo 

lo tanto, usted podría ir a buscar los paquetes de 3 ª parte instalados en $ HOME/go/src/... Y, usted podría mantener su código controlada en $ HOME/PRY/foo/src.

ref: go help gopath

+0

Esto! O la respuesta de Sonia. – user7610