Как использовать код Visual Studio с Haskell и Docker - PullRequest
2 голосов
/ 21 января 2020

Многие люди используют Visual Studio Code. Очень распространенный сценарий сегодня - использовать Docker. Итак, у меня есть Haskell код в Docker с инструментом «стек» - все хорошо, я строю свой проект без ошибок. Я могу использовать Visual Studio Code с Haskell на моей хост-машине (с различными расширениями, например, Haskelly работает в основном хорошо). Это происходит под какой-то учетной записью пользователя. Теперь я хочу работать с моим Haskell проектом, который находится в Docker, где моя учетная запись root. Итак, я установил расширение "Docker Workspace". Это работает, правда: я могу добавить какую-то папку из docker в качестве рабочего пространства и редактировать файлы из нее. Но никакой поддержки Haskell нет, только выделение: никаких подсказок типов, ничего («Тип недоступен» и т. П.)! Как я вижу, Хаскелли не может работать с проектом в Docker ИЛИ Я что-то делаю неправильно . Схема:

ON HOST - owner "user"     .      IN DOCKER - owner "root"
----------------------     .      ------------------------
myproj/                    .      myproj/
  .stack-work              .        .stack-work
  all-other-files          .        all-other-files
                           .                |
                           .                |
 Visual Studio Code <----Docker Workspace---'
                           .
                           .

Я монтирую папку своего проекта в docker (я делю ее между хостом и Docker). Невозможно построить проект за пределами Docker из-за зависимостей .so. Итак, Visual Studio Code на хосте открывает папку Docker, если я открою то же самое myproj/ на хосте - расширение Haskell не может работать, потому что компилятор не может построить проект - нет .so зависимостей.

Когда я открывал файлы из Docker, я предполагал, что все расширения будут работать с Docker - если он запускает «стек», он попытается сделать это в docker. Это кажется глупым предположением, поэтому мой вопрос: «как работать с проектом в таком сценарии?» . Я думаю, что это проблема, не относящаяся к Haskell, и расширения для других языков столкнутся с той же проблемой, но, конечно, если проблема имеет решение, то она будет указана c для Haskelly / Haskell ... И я уверен, Многие люди используют код Visual Studio и Docker в таком сценарии, но я не представляю, как это сделать правильно.

Я нашел эти ошибки в журналах:

[2020-01-21 08:55:02.086] [exthost] [error] [UCL.haskelly] provider FAILED
[2020-01-21 08:55:02.086] [exthost] [error] TypeError: Cannot read property 'slice' of null
    at InteroLocationDecoder.extractRange (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroLocationDecoder.js:24:13)
    at InteroLocationDecoder.buildLocation (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroLocationDecoder.js:11:28)
    at InteroLocationDecoder.decode (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroLocationDecoder.js:6:21)
    at HaskellDefinitionProvider.<anonymous> (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:24:47)
    at Generator.next (<anonymous>)
    at fulfilled (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:4:58)

и

[2020-01-21 09:41:52.995] [exthost] [error] [UCL.haskelly] provider FAILED
[2020-01-21 09:41:52.995] [exthost] [error] Error [ERR_STREAM_DESTROYED]: Cannot call write after a stream was destroyed
    at doWrite (_stream_writable.js:413:19)
    at writeOrBuffer (_stream_writable.js:401:5)
    at Socket.Writable.write (_stream_writable.js:301:11)
    at InteroSpawn.<anonymous> (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroSpawn.js:190:30)
    at Generator.next (<anonymous>)
    at /home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroSpawn.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroSpawn.js:3:12)
    at InteroSpawn.executeCommandOnIntero (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroSpawn.js:186:16)
    at InteroSpawn.requestDefinition (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/InteroSpawn.js:170:21)
    at HaskellDefinitionProvider.<anonymous> (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:23:63)
    at Generator.next (<anonymous>)
    at /home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:3:12)
    at HaskellDefinitionProvider.provideDefinition (/home/xyz/.vscode/extensions/ucl.haskelly-0.5.5/out/src/Providers/Definition/index.js:20:16)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:574:358
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:52:287
    at new Promise (<anonymous>)
    at Object.t.asPromise (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:52:259)
    at y.provideDefinition (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:574:329)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:593:526
    at B._withAdapter (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:591:697)
    at B.$provideDefinition (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:593:504)
    at p._doInvokeHandler (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:663:275)
    at p._invokeHandler (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:662:971)
    at p._receiveRequest (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:661:588)
    at p._receiveOneMessage (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:660:468)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:658:691
    at l.fire (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:46:893)
    at _.fire (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:189:274)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:820:285
    at l.fire (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:46:893)
    at _.fire (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:189:274)
    at t.PersistentProtocol._receiveMessage (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:193:629)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:190:824
    at l.fire (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:46:893)
    at p.acceptChunk (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:186:737)
    at /usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:186:89
    at Socket.t (/usr/share/code/resources/app/out/vs/workbench/services/extensions/node/extensionHostProcess.js:195:68)
    at Socket.emit (events.js:200:13)
    at addChunk (_stream_readable.js:294:12)
    at readableAddChunk (_stream_readable.js:275:11)
    at Socket.Readable.push (_stream_readable.js:210:10)
    at Pipe.onStreamRead (internal/stream_base_commons.js:166:17)

но я не уверен, что они связаны с проблемой, потому что я перезагрузил код Visual Studio и больше не видел их.

Я предположил root из проблема заключается в разрешениях (если некоторые файлы были собраны / скомпилированы в Docker, то они недоступны на хосте - теперь они принадлежат root), поэтому я сменил владельца (sudo chown -R xyz .), но расширение Haskelly по-прежнему не работает , Я не знаю, как скомпилировать проект в Docker, но использовать результат (для расширений Haskell требуется код для компиляции - .stack-work/) на хосте, потому что расширение хочет его перекомпилировать .. Буду благодарен за любые ссылки на документацию, форум, блог с решением.

1 Ответ

0 голосов
/ 27 января 2020

Я попробовал H IE в Docker и столкнулся с множеством проблем, поэтому я не уверен, что он работает во всех настройках / средах. Итак, я нашел другой метод для работы с Haskell проектом внутри Docker в коде Visual Studio.

Сначала я установил стек (для сборки проекта), затем установил gh c ( и ghci) внутри Docker (пример основан на образе Debian):

...
ARG STACK_VERSION="2.1.3"
ARG STACK="stack-${STACK_VERSION}-linux-x86_64-static.tar.gz"

RUN mkdir -p /root/.local/bin
RUN apt-get update && apt-get install -y \
  # stack dependencies taken from this script "https://get.haskellstack.org/"
  curl g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg netbase \
  mc \
  libicu-dev libtinfo-dev # they are maybe optional
...
RUN curl -sSLO "https://github.com/commercialhaskell/stack/releases/download/v${STACK_VERSION}/${STACK}" \
    && echo "4e937a6ad7b5e352c5bd03aef29a753e9c4ca7e8ccc22deb5cd54019a8cf130c ${STACK}" | sha256sum -c - \
    && tar --strip=1 -xzf "${STACK}" -C ~/.local/bin "stack-${STACK_VERSION}-linux-x86_64-static/stack" \
    && rm ${STACK}

ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root/.local/bin

RUN mv /root/.local/bin/stack /root/.local/bin/stack.orig
RUN echo '#!/bin/sh' >> /root/.local/bin/stack
RUN echo '/root/.local/bin/stack.orig --allow-different-user $*' >> /root/.local/bin/stack
RUN chmod +x /root/.local/bin/stack
RUN /root/.local/bin/stack install --resolver=lts-13.20 ghc ghci
...

Я использую LTS-13.20. Затем я создал папку ".devcontainer /" в root моего проекта (где находится файл "package.yaml") с одним файлом "devcontainer. json":

{
  "name": "HaskelInDocker",
  "dockerFile": "../../Dockerfile.vscode",
  "appPort": 9000,
  "startup":true,
  "extensions": [
    "dramforever.vscode-ghc-simple"
  ]
}

Вы должны изменить путь к Dockerfile в свойстве "dockerFile" на свой. После этого я создал свой Docker образ как обычно, а затем запустил код Visual Studio, выбрал команду «Удаленные контейнеры: открыть папку в контейнере ...» и выбрал root своего проекта в качестве папки. VSCode запустил контейнер Docker (вы можете проверить его с помощью docker ps) под странным именем с префиксом «vcs-» (в моем случае) и начал сборку проекта. Вы должны подождать, пока это не кончится. Затем вы можете установить курсор на какую-то функцию и увидите подсказку типов - расширение работает! Все сообщения от этого расширения можно найти с помощью CTRL-SHIFT-P, затем Show Logs..., затем выберите «GH C» в списке журналов. Более подробную информацию о dockercontainer механизме можно найти здесь .

PS. Это расширение Docker поддерживает также подключение к существующему (работающему) контейнеру - протестировано, работает нормально ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...