如何通过 devcontainer.json 在远程容器中安装基于 VSIX 文件的扩展?

qma*_*cro 3 visual-studio-code vscode-remote

容器内VS Code 远程开发上下文中,我可以看到可以在devcontainers.json文件中指定要安装的扩展,如vscode-dev-containers 存储库中的示例所示,如下例所示:

"extensions": [
        "dbaeumer.vscode-eslint"
]
Run Code Online (Sandbox Code Playgroud)

我在本地有一个基于 VSIX 文件的扩展,我也想在此处指定,以便将其安装到容器中。但我不确定如何最好地在这里声明它,路径明智。

我查看了容器构建步骤的输出,注意到本地项目目录已安装到容器中(为了可读性添加了换行符):

Run: docker run -a STDOUT -a STDERR -p 127.0.0.1:4004:4004 
  -v /Users/dj/local/projects/test1:/workspaces/test1 
  -v /Users/dj/.gitconfig:/root/.gitconfig 
  -l vsch.quality=insider 
  -l vsch.local.folder=/Users/dj/local/projects/test1 
  -l vsch.remote.devPort=9753 
  vsc-test1-304320e2e9560b5557f6f7871801047f 
  /bin/sh -c echo Container started ;  while sleep 1; do :; done
Run Code Online (Sandbox Code Playgroud)

所以我将我的 VSIX 文件放在项目 ( /Users/dj/local/projects/test1/vscode-cds-1.1.4.vsix)的根目录中,然后它在容器中可用。将容器中此文件的完全限定路径添加到extensions属性中:

"extensions": [
        "dbaeumer.vscode-eslint",
        "/workspaces/test1/vscode-cds-1.1.4.vsix"
]
Run Code Online (Sandbox Code Playgroud)

确实导致将此扩展成功安装到容器中:

Installing extensions...
Installing extension 'dbaeumer.vscode-eslint' v1.8.2...
Extension 'dbaeumer.vscode-eslint' v1.8.2 was successfully installed.
Extension 'vscode-cds-1.1.4.vsix' was successfully installed.    <----
Run Code Online (Sandbox Code Playgroud)

伟大的!

但是这个 hack 要求我对目录所在的.devcontainer/目录的名称进行硬编码(即test1/),这当然是我想避免的。

有没有办法在不硬编码文件中的整个项目目录名称的情况下做到这一点devcontainer.json

谢谢你。

qma*_*cro 5

问这个问题大约 10 分钟后,我想到了一种不同的方法,这可能仍然是一种黑客行为,但它避免了必须使用项目目录名称。我将 VSIX 文件放在.devcontainer/目录中,然后在我的末尾添加了一个 COPY 命令Dockerfile

COPY vscode-cds-1.1.4.vsix /tmp/
Run Code Online (Sandbox Code Playgroud)

然后可以在extensions属性中指定这个中性路径:

"extensions": [
        "dbaeumer.vscode-eslint",
        "/tmp/vscode-cds-1.1.4.vsix"
]
Run Code Online (Sandbox Code Playgroud)

这有效。想知道是否有更好的方法。

  • 使用卷安装代替“COPY”命令也可以。这样你就不需要污染你的“Dockerfile”,所有配置都在你的“.devcontainer.json”文件中。这也意味着您可以提供卷安装的绝对路径并重复使用相同的 vsix 文件,而不是将其复制到所有项目。 (2认同)