vscode extension 수정하기 (log watcher)
목차
logwatcher 확장 수정
log watcher 라는 확장을 수정해 볼 것이다.
log watcher 확장은 심볼릭 링크로 걸린 log file은 감시하지 않는다. 따라서 간단하게 수정하여 심볼릭 링크로 걸린 log file도 감시할 수 있도록 수정해보자.
성능상의 이유로 FileSystemWatcher
는 심볼릭 링크에 링킹된 파일은 감시하지 않는다고 한다.
따라서 확장을 수정해 심볼릭링크를 문자열에 입력할 시 해당 심볼릭 링크의 실제 파일 자동으로 획득해 추가하도록 수정할 것이다.
https://code.visualstudio.com/api/references/vscode-api#FileSystemWatcher
수정
log watcher 확장 디렉토리로 접근한다. (<vscode 확장 디렉토리>/automattic.logwatcher-1.0.0/out
)
watchfilecommand.js
파일 내용을 아래와 같이 수정한다.
먼저 node:js
모듈을 추가한다.
1
const fsnode_1 = require("node:fs");
심볼릭 링크의 실제 파일을 가져오는 함수를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
async function get_symlink(filename) {
const lnkpromise = new Promise((resolve, reject) => {
fsnode_1.readlink(filename, (err, linkString) => {
if (err) {
reject(filename);
} else {
resolve(linkString);
}
});
});
let result = filename;
await lnkpromise.then(data=> {
result = data;
});
return result;
}
확장의 실제 동작 함수는 setUpWatcher
함수에서 담당한다.
따라서 setUpWrapper
함수와 argument를 수정하고 createOutputChannel
함수의 argument를 수정한다.
1
2
3
4
5
6
-async function setUpWatcher(filename) {
+async function setUpWatcher(realfile, filename) {
const emitter = new node_events_1.EventEmitter();
- const outputChannel = vscode_1.window.createOutputChannel(`Watch ${filename}`, 'log');
+ const outputChannel = vscode_1.window.createOutputChannel(`Watch ${realfile}`, 'log');
doWatchFile
함수를 수정한다.
1
2
3
4
5
6
7
8
9
async function doWatchFile(filename, quiet = false) {
+ let linkfile = await get_symlink(filename);
- let resource = (0, resources_1.getResource)(filename) ?? await setUpWatcher(filename);
+ let resource = (0, resources_1.getResource)(filename) ?? await setUpWatcher(filename, linkfile);
if (!resource) {
return null;
}
// ...
}
stopwatchingcommand.js
파일에 아래 함수를 추가한다.
(해당 내용은 stopWatchingAll
- 모든 확장에 대한 감시 중지 기능을 추가하는 내용이다.)
1
2
3
4
async function stopWatchingAllCommandHandler() {
(0, resources_1.freeAllResources)();
}
exports.stopWatchingAllCommandHandler = stopWatchingAllCommandHandler;
extension.js
파일에 아래 코드를 추가한다.
registerCommand('logwatcher.stopWatching', ...
부분 뒤쪽에 아래 코드를 삽입한다.
1
vscode_1.commands.registerCommand('logwatcher.stopWatchingAll', stopwatchingcommand_1.stopWatchingAllCommandHandler),
../package.json
에 아래 코드를 추가한다.
commands
부분의 logwatcher.stopWatching
뒤쪽에 아래 코드를 삽입한다.
1
2
3
4
5
6
7
8
9
10
{
"command": "logwatcher.stopWatching",
"title": "Stop Watching File…",
"category": "Log Watcher"
+ },
+ {
+ "command": "logwatcher.stopWatchingAll",
+ "title": "Stop Watching File All",
+ "category": "Log Watcher"
}