Esta es una discusión, pero para mantener registros y podría ayudar a otras personas. Así que lo grabo aquí. Sé que hay un canal #cider/#emacs
en Slack. Publicaré este enlace allí.
Quiero usar una versión y un entorno diferentes de Clojure. Hay una imagen oficial de Clojure Docker. https://hub.docker.com/_/clojure
Estoy pensando en cómo usar el binario y REPL de la imagen de Clojure en Emacs y CIDER.
Hay algunas formas de acceder a la imagen de Docker como yo sé:
docker.el
.docker-tramp.el
y docker.el
para acceder a los comandos binarios del contenedor clojure como clojure
, clj
etc. Para que Emacs los use como ruta de comando ejecutable. Al igual que CIDER, tiene la opción de personalizar cider-clojure-cli-command
. Intenté seguir, pero fallé.(add-to-list 'exec-path "/docker:clojure:/usr/local/bin/")
(setq cider-clojure-cli-command "/docker:clojure:/usr/local/bin/clojure")
¿Alguien tiene sugerencia y solución? Bienvenido a agregar. (Esto podría agregarse a Wiki, cuando la discusión esté casi terminada) Gracias por ver.
Descubrí que CIDER tiene una variable para mantener registros de conexión. Podría usarse en mayúsculas.
Como esto:
(setq cider-known-endpoints
'(("host-a" "10.10.10.1" "7888")
("host-b" "7888")))
docker-tramp.el
para abrir archivos en el contenedor, luego cider-jack-in-*
, CIDER podría manejar esto de manera transparente.Yo uso docker-compose y volúmenes:
# docker-compose.yml
version: '3'
volumes:
m2:
gitlibs:
services:
app:
image: clojure:tools-deps-alpine
working_dir: "${PWD}"
command: "true"
ports:
- "4444:4444" # nrepl
- "4445:4445" # http
environment:
- "CLJ_CONFIG=${PWD}/.docker-clojure"
- DATABASE_URL=postgres://postgres:password<strong i="6">@db</strong>:5432/postgres
- TEST_DATABASE_URL=postgres://postgres:password@test-db:5432/postgres
- PORT=4446
volumes:
- ".:${PWD}:cached" # cached - MacOS option
- m2:/root/.m2
- gitlibs:/root/.gitlibs
links:
- db
- test-db
db: &db
image: postgres:10.4-alpine
environment:
- POSTGRES_PASSWORD=password
test-db:
<<: *db
;; .docker-clojure/deps.edn
{:aliases {:cider {:extra-deps {darkleaf/cider-tools-desp
{:git/url "https://github.com/darkleaf/cider-tools-deps.git"
:sha "1025b510db24b36ab741bc5599e36806eec904ec"}}
:main-opts ["-m" "darkleaf.cider-tools-deps"
"port" "4444" "host" "0.0.0.0"]}
:repl {:extra-deps {darkleaf/repl-tools-deps
{:git/url "https://github.com/darkleaf/repl-tools-deps.git"
:sha "04e128ca67785e4eb7ccaecfdaffa3054442358c"}}
:main-opts ["-m" "darkleaf.repl-tools-deps"]}
:run-tests {:extra-deps {com.cognitect/test-runner
{:git/url "https://github.com/cognitect-labs/test-runner.git"
:sha "028a6d41ac9ac5d5c405dfc38e4da6b4cc1255d5"}}
:main-opts ["-m" "cognitect.test-runner"]}
:coverage {:extra-deps {cloverage {:mvn/version "1.0.13"}}
:main-opts ["-m" "cloverage.coverage" "-p" "src" "-s" "test"]}}}
Ejecuto docker-compose run --rm --service-port app bash
y luego clojure -Acider
.
En emacs presiono C-c M-c
y me conecto a localhost:4444
.
Las dependencias se instalan en volúmenes. Entonces Emacs no puede tener acceso a ellos.
Las dependencias se instalan en volúmenes. Entonces Emacs no puede tener acceso a ellos.
Estoy confundido con esto. Las dependencias se instalan en volúmenes, pero Emacs CIDER se conecta al contenedor iniciado clojure -Acider
alias. Entonces, si clojure -Acider
debería poder acceder a todas las dependencias en el contenedor. ¿Agregar dependencias del proyecto en un contenedor deps.edn
file?
¿Puede Docker acceder a las dependencias .m2/
del sistema host? De modo que Docker será un puente entre Emacs CIDER y las dependencias del sistema host.
Tenemos Maven y herramientas como Boot y Leiningen, ¿por qué demonios sería necesario Docker aquí? ¿Solo porque está de moda?
@stardiviner
Estoy confundido con esto.
REPL se inicia dentro de un contenedor docker. Este proceso tiene acceso al sistema de archivos del contenedor.
con rutas relacionadas con contenedores. Bloquear en la sección de volúmenes:
volumes:
- ".:${PWD}:cached" # cached - MacOS option
- m2:/root/.m2
- gitlibs:/root/.gitlibs
$PWD
es /User/darkleaf/projects/project
por ejemplo. Entonces las fuentes del proyecto son
disponible en la misma ruta dentro del contenedor.
Tiene sentido. REPL puede enviar a Emacs alguna ruta y esa ruta está relacionada con el contenedor.
Emacs no puede obtener un archivo en el sistema de archivos del host si las rutas son inconsistentes.
Entonces uso ${PWD}
.
Más tarde solía montar .m2
y .gitlibs
desde el sistema de archivos del host.
Utilizo Docker para Mac y sus volúmenes de host son lentos. Así que cambié a volúmenes de contenedores.
@darkleaf ya veo. Gracias.
@zilti cambia la versión de Java, ¿la versión de Clojure es más simple en Docker? y es más limpio. Imagen fácil de empaquetar y luego compartir, problema ambiental más simple de reproducir. Admito que Leiningen y Boot (no lo he usado yo mismo) es genial. Aún así, gracias por tu consejo.
Parece que lo resolvió, así que cerraré este boleto.
Comentario más útil
@darkleaf ya veo. Gracias.
@zilti cambia la versión de Java, ¿la versión de Clojure es más simple en Docker? y es más limpio. Imagen fácil de empaquetar y luego compartir, problema ambiental más simple de reproducir. Admito que Leiningen y Boot (no lo he usado yo mismo) es genial. Aún así, gracias por tu consejo.