Una breve introducción al caso de uso:
Estoy usando un docker
contenedor para ejecutar mis go
pruebas usando go test ./...
. Esto se puede lograr fácilmente usando docker exec <container> /bin/sh -c "go test ./..."
. Lamentablemente, se go test ./...
ejecuta en todos los subdirectorios y me gustaría excluir uno (el directorio de proveedores).
La solución recomendada para esto es usar el siguiente comando:, de go test $(go list ./... | grep -v '<excluded>'
alguna manera, esto me deja con el siguiente resultado:
docker run golang:1.6.2-alpine /bin/sh -c "go test "
(He probado esto tanto en ejecución como en ejecución, pero probablemente usan el mismo núcleo).
Cuando me meto en el contenedor usando docker exec -it <container_id> /bin/sh
y ejecuto exactamente el mismo comando, funciona de maravilla.
Parece que ejecutar comandos de shell a través de docker exec / run no admite ningún comando anidado con $()
?
$(go list ./... | grep -v '<excluded>'
, que<excluded>
es?vendor
por ejemplo.$(...)
su shell lo expandió entre comillas dobles antes de que se ejecutara dentro del contenedor acoplable. Entonces, el problema puede provenir de su contenido de directorio actual. Hizodocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
el trabajo?Respuestas:
Su comando puede no funcionar como esperaba gracias a un error común de bash:
El comando que está intentando ejecutar realizará la expansión de la subshell
$()
en su host porque está entre comillas dobles.Esto se puede resolver con una simple cita de su comando como lo sugiere @cuonglm en los comentarios de la pregunta.
EDITAR: una pequeña demostración
fuente
De
go test --help
:Así que supongo que algo así
go test -run "(!vendor)" ./...
se saltaría esa carpeta en particular.fuente
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")