Post

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"
			}
This post is licensed under CC BY 4.0 by the author.