En nodejs uso __dirname . ¿Cuál es el equivalente de esto en Golang?
Busqué en Google y descubrí este artículo http://andrewbrookins.com/tech/golang-get-directory-of-the-current-file/ . Donde usa el siguiente código
_, filename, _, _ := runtime.Caller(1)
f, err := os.Open(path.Join(path.Dir(filename), "data.csv"))
¿Pero es la forma correcta o idiomática de hacer en Golang?
0
, no1
, aruntime.Caller()
.runtime.Caller(0)
le dará la ruta del archivo fuente, como$GOPATH/src/packagename/main.go
. Las otras respuestas en este hilo están tratando de devolver la ruta del ejecutable (como$GOPATH/bin/packagename
).Respuestas:
Esto debería hacerlo:
fuente
_, currentFilePath, _, _ := runtime.Caller(0)
dirpath := path.Dir(currentFilePath)
(tengaruntime.Caller(0)
en cuenta el en lugar deruntime.Caller(1)
)EDITAR: A partir de Go 1.8 (lanzado en febrero de 2017), la forma recomendada de hacerlo es con
os.Executable
:Para obtener solo el directorio del ejecutable que puede usar
path/filepath.Dir
.Ejemplo :
ANTIGUA RESPUESTA:
Deberías poder usar
os.Getwd
Por ejemplo:
fuente
runtime.Caller
es lo más cercano a "idiomático"path/filepath.Dir
porquepath.Dir
solo funciona con barras diagonales (estilo Unix) como separadores de directorios.Usar paquete osext
Proporciona una función
ExecutableFolder()
que devuelve una ruta absoluta a la carpeta donde reside el ejecutable del programa que se está ejecutando actualmente (útil para trabajos cron). Es multiplataforma.Documentación en línea
fuente
go run main.go
para el desarrollo local. No estoy seguro de cuál es la mejor manera de evitar eso sin crear un ejecutable de antemano cada vez.go run
. Estos binarios se colocan en una carpeta temporal cada vez.go install
, luego corrergo build -v *.go && ./main
. El-v
le diría qué archivos se están construyendo. En general, he descubierto que el tiempo es diferentego run
ygo build
tolerable si ya lo he ejecutadogo install
. Para los usuarios de Windows en powershell, el comando serágo build -v {*}.go && ./main.exe
$GOPATH/bin/
, ¿por qué no usarlo$GOPATH/bin/
?Como se indicó en el comentario, esto devuelve el directorio que está actualmente activo.
fuente
si usas de esta manera:
obtendrá la ruta / tmp cuando esté ejecutando el programa usando algún IDE como GoLang porque el ejecutable guardará y se ejecutará desde / tmp
Creo que la mejor manera de obtener el directorio de trabajo actual o '.' es :
la función os.Getwd () devolverá el directorio de trabajo actual. y todo sin usar ninguna biblioteca externa: D
fuente
Si usa el paquete osext de kardianos y necesita probarlo localmente, como Derek Dowling comentó:
La solución a esto es hacer una utilidad gorun.exe en lugar de usar go run. La utilidad gorun.exe compilará el proyecto usando "go build", luego lo ejecutará inmediatamente después, en el directorio normal de su proyecto.
Tuve este problema con otros compiladores y me encontré haciendo estas utilidades ya que no se envían con el compilador ... es especialmente arcano con herramientas como C donde tienes que compilar y vincular y luego ejecutarlo (demasiado trabajo).
Si a alguien le gusta mi idea de gorun.exe (o elf), probablemente lo subiré a github pronto ...
Lo sentimos, esta respuesta se entiende como un comentario, pero no puedo comentar porque todavía no tengo una reputación lo suficientemente grande.
Alternativamente, "go run" podría modificarse (si aún no tiene esta función) para tener un parámetro como "go run -notemp" para no ejecutar el programa en un directorio temporal (o algo similar). Pero preferiría simplemente escribir gorun o "gor", ya que es más corto que un parámetro complicado. Gorun.exe o gor.exe tendrían que instalarse en el mismo directorio que su compilador go
Implementar gorun.exe (o gor.exe) sería trivial, como lo hice con otros compiladores en solo unas pocas líneas de código ... (últimas palabras famosas ;-)
fuente
_, callerFile, _, _ := runtime.Caller(0)
executablePath := filepath.Dir(callerFile)
en su lugaros.Executable
: https://tip.golang.org/pkg/os/#Executablefilepath.EvalSymlinks
: https://golang.org/pkg/path/filepath/#EvalSymlinksDemo completa:
fuente
A veces esto es suficiente, el primer argumento siempre será la ruta del archivo
fuente
La respuesta de Gustavo Niemeyer es genial. Pero en Windows, el proceso de ejecución se encuentra principalmente en otro directorio, como este:
Si usa la ruta relativa del archivo, como
"/config/api.yaml"
, esto usará la ruta del proyecto donde existe su código.fuente