我有一個 VSCode 擴展,當我運行的程式遇到斷點時,它會啟動 Python 除錯會話。但是,Python 程式當前通過寫入擴展程式監視的檔案來與擴展程式通信。
Hacky 但它有效,除非我打開了兩個 VSCode 實體,否則它們會爭先恐后地開始除錯。
有什么辦法可以讓從 VSCode 的嵌入式終端運行的程式找出它在哪個 VSCode 實體中運行,以便擴展程式可以確定它是否連接到同一個實體?
uj5u.com熱心網友回復:
你可以這樣做!官方 Git 擴展必須為 askpass 支持做類似的事情。基本上在您的擴展activate()功能中,您可以這樣做:
export function activate(context: ExtensionContext) {
const ipcPath = getIpcPath(context);
context.environmentVariableCollection.replace("MY_EXTENSION_IPC_PATH", ipcPath);
這將在您的程式可以讀取的所有集成 shell 中設定一個環境變數。我懷疑如果您的分機按需激活可能會出現問題(我猜它只會在您的分機激活后應用于新終端)所以您可能需要activationEvents在package.json.
要與擴展通信,您可以使用 IPC,但您需要一個唯一的 IPC 路徑。不幸的是,它似乎沒有ExtensionContext任何型別的唯一識別符號,所以我像這樣破解它:
let extensionInstance = 0;
function getIpcPath(context: ExtensionContext): string {
const hash = crypto.createHash("sha1");
hash.update(`${context.storageUri}${ extensionInstance}${process.pid}`);
const id = hash.digest("hex").slice(0, 10);
if (process.platform === "win32") {
return `\\\\.\\pipe\\my_extension_ipc_${id}`;
}
if (process.env["XDG_RUNTIME_DIR"] !== undefined) {
return path.join(process.env["XDG_RUNTIME_DIR"], `my_extension_ipc_${id}.sock`);
}
return path.join(os.tmpdir(), `my_extension_ipc_${id}.sock`);
}
這與 Git 擴展所做的非常相似。不完全一樣,但它似乎有效。
最后,我將 IPC 路徑作為命令列引數傳遞給我的擴展程式的語言服務器,以便它可以在該地址開始偵聽。
let serverOptions: ServerOptions = {
run: {
command: serverCommand,
args: ["--ipc-path", ipcPath],
},
debug: {
command: serverCommand,
args: ["--ipc-path", ipcPath, "--debug"],
},
};
似乎作業正常!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/393672.html
標籤:视觉工作室代码
