fix: cannot execute code --version in windows and linux

This commit is contained in:
Levi Yan
2025-01-08 18:36:59 +08:00
parent 7e470461eb
commit bdf708597d
3 changed files with 68 additions and 69 deletions

View File

@@ -102,6 +102,8 @@
"format": "eslint src --ext ts" "format": "eslint src --ext ts"
}, },
"dependencies": { "dependencies": {
"axios": "^1.7.9",
"cheerio": "^1.0.0",
"fs-plus": "~3.1.1", "fs-plus": "~3.1.1",
"node-ssh": "^13.2.0", "node-ssh": "^13.2.0",
"sshpk": "^1.18.0" "sshpk": "^1.18.0"

View File

@@ -28,7 +28,6 @@ export default class RemoteContainer {
cancellable: false cancellable: false
}, async (progress) => { }, async (progress) => {
try { try {
if (password === undefined) { if (password === undefined) {
// connect with key // connect with key
await ssh.connect({ await ssh.connect({
@@ -40,26 +39,28 @@ export default class RemoteContainer {
progress.report({ message: "连接成功,开始安装" }); progress.report({ message: "连接成功,开始安装" });
// install vscode-server and devstar extension // install vscode-server and devstar extension
const vscodeCommitId = await utils.getVsCodeCommitId(); const vscodeCommitId = await utils.getVsCodeCommitId()
const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` if ("" != vscodeCommitId) {
const installVscodeServerScript = ` const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz`
mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ const installVscodeServerScript = `
if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\
~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then
else ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar
wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ else
mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\
cd ~/.vscode-server/bin/${vscodeCommitId} && \\ mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\
tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ cd ~/.vscode-server/bin/${vscodeCommitId} && \\
rm vscode-server-linux-x64.tar.gz && \\ tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\
~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar rm vscode-server-linux-x64.tar.gz && \\
fi ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar
`; fi
await ssh.execCommand(installVscodeServerScript); `;
console.log("vscode-server and extension installed"); await ssh.execCommand(installVscodeServerScript);
vscode.window.showInformationMessage('安装完成!'); console.log("vscode-server and extension installed");
vscode.window.showInformationMessage('安装完成!');
}
await ssh.dispose(); await ssh.dispose();
} else { } else {
// connect with password (deprecate in future) // connect with password (deprecate in future)
await ssh.connect({ await ssh.connect({
@@ -71,35 +72,27 @@ export default class RemoteContainer {
progress.report({ message: "连接成功,开始安装" }); progress.report({ message: "连接成功,开始安装" });
// install vscode-server and devstar extension // install vscode-server and devstar extension
const vscodeCommitId = await utils.getVsCodeCommitId(); const vscodeCommitId = await utils.getVsCodeCommitId()
const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz` if ("" != vscodeCommitId) {
const installVscodeServerScript = ` const vscodeServerUrl = `https://vscode.download.prss.microsoft.com/dbazure/download/stable/${vscodeCommitId}/vscode-server-linux-x64.tar.gz`
mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\ const installVscodeServerScript = `
if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then mkdir -p ~/.vscode-server/bin/${vscodeCommitId} && \\
~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar if [ "$(ls -A ~/.vscode-server/bin/${vscodeCommitId})" ]; then
else ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar
wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\ else
mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\ wget ${vscodeServerUrl} -O vscode-server-linux-x64.tar.gz && \\
cd ~/.vscode-server/bin/${vscodeCommitId} && \\ mv vscode-server-linux-x64.tar.gz ~/.vscode-server/bin/${vscodeCommitId} && \\
tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\ cd ~/.vscode-server/bin/${vscodeCommitId} && \\
rm vscode-server-linux-x64.tar.gz && \\ tar -xvzf vscode-server-linux-x64.tar.gz --strip-components 1 && \\
~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar rm vscode-server-linux-x64.tar.gz && \\
fi ~/.vscode-server/bin/${vscodeCommitId}/bin/code-server --install-extension mengning.devstar
`; fi
await ssh.execCommand(installVscodeServerScript); `;
console.log("vscode-server and extension installed"); await ssh.execCommand(installVscodeServerScript);
vscode.window.showInformationMessage('安装完成!'); console.log("vscode-server and extension installed");
vscode.window.showInformationMessage('安装完成!');
// add the public key to the remote authorized_keys
if (!utils.existDefaultPublicKey() || !utils.existDefaultPrivateKey()) {
// if there is no public key, generate one
utils.createSSHKey()
} }
const publicKey = utils.getDefaultPublicKey();
await ssh.execCommand(`mkdir -p ~/.ssh && echo '${publicKey}' >> ~/.ssh/authorized_keys`);
console.log('Public key added to remote authorized_keys');
await ssh.dispose(); await ssh.dispose();
} }

View File

@@ -1,13 +1,14 @@
import { exec } from 'child_process';
import * as http from 'http'; import * as http from 'http';
import * as https from 'https'; import * as https from 'https';
import * as fs from 'fs'; import * as fs from 'fs';
import * as path from 'path'; import * as path from 'path';
import * as os from 'os'; import * as os from 'os';
import { BlobOptions } from 'buffer'; import * as vscode from 'vscode';
const { const {
generateKeyPairSync, generateKeyPairSync,
} = require('node:crypto') } = require('node:crypto')
const axios = require('axios');
const cheerio = require('cheerio');
export function fetch(url: string): Promise<string> { export function fetch(url: string): Promise<string> {
// determine the library to use (based on the url protocol) // determine the library to use (based on the url protocol)
@@ -38,26 +39,29 @@ export const Sleep = (ms: number) => {
return new Promise(resolve => setTimeout(resolve, ms)) return new Promise(resolve => setTimeout(resolve, ms))
} }
export function getVsCodeCommitId(): Promise<string> { export async function getVsCodeCommitId(): Promise<string> {
return new Promise((resolve, reject) => { // 获取vscode version
exec('code --version', (error, stdout, stderr) => { const version = vscode.version
if (error) {
reject('Error occurred:' + error.message); // 根据version提取相应的release页面中的commitid
return; try{
} const { data } = await axios.get(`https://github.com/microsoft/vscode/releases/tag/${version}`);
if (stderr) {
reject('Error output:' + stderr); // Load the HTML into cheerio
return; const $ = cheerio.load(data);
} // Find the <a> tag with the 'data-hovercard-type="commit"' attribute
const lines = stdout.trim().split('\n'); const commitLink = $('a[data-hovercard-type="commit"]');
if (lines.length > 1) { // Extract the href attribute and commit hash
const commitId = lines[1]; // 第二行是 commit ID const href = commitLink.attr('href'); // href example: /microsoft/vscode/commit/fabdb6a30b49f79a7aba0f2ad9df9b399473380f
resolve(commitId); const commitHash = href.split('/').pop();
} else {
reject('Unexpected output format:' + stdout); console.log('Commit Hash:', commitHash);
}
}); return commitHash
}) } catch(error) {
console.error('Failed to get commit id: ' + error)
return ""
}
} }
export function getDefaultPrivateKeyPath(): string { export function getDefaultPrivateKeyPath(): string {