2012-09-20 10 views
14

Esto es algo un seguimiento de mi última pregunta: golang: installing packages in a local directorygolang: ir instalación intenta/usr/local en lugar de GOPATH

tengo GOPATH conjunto a $HOME/prog/go/gopath y existe este camino con tres directorios:

~/prog/go/gopath$ ls 
bin pkg src 

ahora trato de instalar un module to access the redis database la que me pide que ejecute

go install 

dentro del directorio de origen. Sin embargo, el comando go install me da

~/prog/go/gopath/src/redis (go1)$ go install 
go install flag: open /usr/local/go/pkg/darwin_amd64/flag.a: permission denied 
~/prog/go/gopath/src/redis (go1)$ echo $GOPATH 
<myhomedir>/prog/go/gopath 

(donde <myhomedir> es una ruta válida)

Pregunta 1: ¿Por qué no tomar go install$GOPATH en cuenta? Pregunta 2: ¿cómo convencer go install para usar $GOPATH?

Respuesta

6

No estoy seguro de cómo configurarlo, pero es posible que necesite compilar paquetes desde la biblioteca estándar, pero no puede debido a los permisos. Puede probar

cd /usr/local/go/src 
sudo ./all.bash 

Esto debería construir la biblioteca estándar y ejecutar pruebas para asegurarse de que todo está bien.

Asegúrese de tener los permisos adecuados para leer y ejecutar desde $ GOROOT según sea necesario. Personalmente, simplemente descargué el archivo de golang.org y lo mantuve bajo ~/local/go y configuré GOROOT de manera apropiada.

+0

No estoy seguro de entender lo que hace. Mi instalación funciona bien hasta el momento. Nunca tuve ningún problema e incluso la compilación cruzada funciona bien. – topskip

+0

¿tiene permiso para leer /usr/local/go/pkg/darwin_amd64/flag.a? – dskinner

+0

sí, puedo leer '/ usr/local/go/pkg/darwin_amd64/flag.a' como mi usuario principal – topskip

3

creo que el comando que necesita es "ir a buscar":

go get github.com/alphazero/Go-Redis 

se descarga la biblioteca Go-Redis y ponerlo en su directorio $ GOPATH/src.

go install realiza una compilación e instala en su propio código fuente.

Debo admitir que luché con todo este concepto por un tiempo, pero una relectura cuidadosa de "How to Write Go" y la sección de organización del código contiene lo que necesita saber sobre cómo funciona el comando go.

+0

Eso me da el mismo error ... – topskip

+0

... btw: el 'go get' debe estar sin' https: // 'por lo que he intentado. Gracias por el enlace a "How to Write Go"! – topskip

+0

¿No es GOPATH una lista de rutas (análoga a PATH)? Eso es lo que dice la documentación, si no recuerdo mal. ¿Estás seguro de que no te refieres a GOROOT? – weberc2

0

La solución es eliminar GOROOT de .bash_profile. Luego, el comando go lo instalará en su directorio GOPATH. Y es extraño: cuando configuro GOROOT en mi .bash_profile nuevamente y creo un nuevo shell, también funciona.

5

Problemas similares aquí. Cuando reviso mi $ GOROOT, descubro que todas las bibliotecas ya están construidas allí. Pero por alguna razón, intenta reconstruir todas las bibliotecas. Así que solo hago un pequeño truco:

find /usr/lib/go/pkg/ -name "*.*" | sudo xargs touch 

Entonces todo funciona bien.

+0

Debido a las diferencias de marca de tiempo entre los archivos en $ GOROOT/src y $ GOROOT/pkg, se determina que los archivos pkg están desactualizados y están intentando para ser reconstruido Pero como el usuario no puede escribir en ellas, existe un error de permiso denegado. Tocar cada archivo .a soluciona el problema. –

+1

El comando que ejecuté fue ligeramente diferente: 'find/usr/local/go -name" * .a "-exec touch -r \' which go \ '{} \;' –