【问题标题】:Typescript in Docker: "Cannot find module" in Visual Studio code host typescript compilerDocker 中的打字稿:Visual Studio 代码主机打字稿编译器中的“找不到模块”
【发布时间】:2020-06-27 04:33:08
【问题描述】:

项目设置

我有一个在本地 Docker 容器中运行的 Typescript 项目。我有以下两卷(这是在docker-compose.yml):

volumes:
  - .:/node/app

第一个卷是绑定挂载,用于将我的应用程序的源代码复制到容器中。

  - /node/app/node_modules/

第二卷绑定装载。这意味着当npm install 在容器内运行时,在项目的/node/app 工作目录中,依赖项将被安装到容器中的node_modules 文件夹中。

我的理解是,允许主机和容器拥有单独的node_modules 是一种常见的做法。我对此设置的意图是仅在主机中安装和运行一些工具,例如 prettier,因此我可以在主机中 npm install --only=development 并安装 prettier,因为它指定为 devDependency,并且现在我的编辑器可以使用 prettier。

问题

在我的编辑器中,当 typescript 编译器运行时,它显示“找不到模块”错误:

我的理解是发生这种情况是因为这些模块不在磁盘上。这是因为我的上述设置。我制作了包含我的非开发依赖项node_modules,例如 React,仅在容器内可用。

我的问题

我是 Docker 新手,我的理解是在容器内做事情通常是好的,包括开发。我试图避免在主机中出现npm install,因为我并不真正想要或不需要主机中的所有依赖项。在添加新依赖项时,我也不想npm install 两次,一次在主机上,一次在容器中。

如果导入的 node_modules 不存在,有没有办法阻止 Typescript 出错(比如只加载它们的类型定义,maye?),有没有办法在 Visual 中指向 Typescript 的编译器Studio Code 以某种方式添加到容器中,因此无需在主机上安装它们就可以看到它们,同时仍然让我在主机上安装其他依赖项,比如更漂亮?

或者是在主机上npm install的唯一方法?

【问题讨论】:

  • 我遇到了同样的情况,如果你使用 VSCode,我发现的一个选项是使用 Remote - Containers 扩展。它允许您插入容器并直接在那里工作。 link

标签: typescript docker visual-studio-code


【解决方案1】:

如果您想在 docker 内部和外部安装模块,则为 node_modules 安装一个单独的卷是很常见的。例如,如果您想在 docker 容器之外运行您的项目,并且能够在 docker 容器中运行它。

您的建议是,在容器内部有一些模块,而在容器外部有一些模块,我不确定是否需要这样做。也许更好的解决方案是在 docker 容器中运行 prettier...

services:
    prettier:
        image: node:latest
        volumes:
            - .:/node/app
        working_dir: /node/app
        entrypoint: npx prettier

然后就可以运行了

docker-compose run --rm prettier <options>

【讨论】:

    【解决方案2】:

    我从未听说过这种“分离”。你有一些资料可以解释为什么这是“好”(作为评论)吗?

    而我的回答是:你可以更改node_modules-directory 的路径。看看Specify path to node_modules in package.json

    所以你可以在 docker 中定义一个挂载点到本地文件夹。阅读此How-to
    而这个文件夹,你可以在 npm 中定义。也许您必须更改 docker-container 的运行用户,以便文件权限与您的主机匹配。

    但是...

    我强烈建议像它应该使用的那样使用 npm。将其安装在您的主机上并使用 project-local node_modules-文件夹。使用 docker-volume-hack 会容易得多。

    【讨论】:

    • 没有太大帮助,但感谢您在这个问题上的活动
    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多