터미널1에서 만든 기능을 쉘스크립트를 활용하여 구현하려고 한다.
extension.ts-activate 함수에 브레이크 포인트를 걸고
지난번에 만든 Make Folder 기능을 실행하면 디버그가 걸린다.
매개변수 context를 확인하면 해당 익스텐션의 정보들이 있는데
해당 정보들 중 extensionPath가 있는데 이 path는 현재는 해당 익스텐션 프로젝트의 경로이다.
따라서 해당 프로젝트에 스크립트를 추가해서 배포한다면 스크립트를 사용 할 수 있을 것이다.
프로젝트에 script/mkdir.sh 스크립트를 추가하고
command를 추가했다.
terminal.ts 에 mkdir 함수를 복사해 mkdirInScript 함수를 생성하고
프로젝트 경로가 필요하기 때문에 매개변수를 추가한다.
export async function mkdirInScript(context: vscode.ExtensionContext) {
const openFolder = await vscode.window.showOpenDialog({
filters: {
'All files (*.*)': ['*']
},
canSelectFolders: true,
canSelectFiles: false,
canSelectMany: false,
openLabel: 'Select Folder',
});
if (!openFolder || openFolder.length < 1) {
vscode.window.showErrorMessage("다시 선택하세요.");
return;
}
const folderName = await vscode.window.showInputBox({
placeHolder: "Folder Name",
prompt: "Folder Name",
});
if(folderName === "" || folderName === "undefined"){
vscode.window.showErrorMessage("다시 입력해주세요.");
return;
}
let terminal = vscode.window.createTerminal({
name: "Make Folder",
hideFromUser: false,
});
const forderPath = openFolder[0].fsPath;
terminal.show();
terminal.sendText("mkdir " + forderPath + "/" + folderName);
}
맨밑 sendText함수를 수정한다.
terminal.sendText("bash " + context.extensionPath + "/script/mkdir.sh " + folderName + " " + forderPath);
extension.ts에 기능을 추가한다.
let makeFolderInScript = vscode.commands.registerCommand('terminal.mkdirinscript', async () => terminal.mkdirInScript(context));
context.subscriptions.push(makeFolderInScript);
Make Folder기능과 똑같이 실행시키면
쉘 스크립트로 폴더가 만들어진걸 확인할 수 있다.
블로그에서는 터미널에서 간단히 폴더만 만들었지만
터미널에서는 압축, 서버 접속해서 업로드, DB 실행, 쿼리 실행, 빌드, 정보 출력하기, 프로그램 실행 등
모든 것을 할 수 있기 때문에 두 기능만 이용하더라도 자동화를 쉽게 할 수 있다.
아래는 Java프로젝트를 익스텐션에서 실행하는 간단한 예제이다.
java 프로젝트를 생성하고
utils.ts 파일 생성, javaBuild 함수 추가
javatest.buildtest command를 추가해주었다.
extension.ts.activate에 추가
let javaBuild = vscode.commands.registerCommand('javatest.buildtest', async () => utils.javaBuild(context));
context.subscriptions.push(javaBuild);
utils.ts에 추가
import * as vscode from 'vscode';
export async function javaBuild(context: vscode.ExtensionContext) {
let terminal = vscode.window.createTerminal({
name: "Java Build",
hideFromUser: false,
});
terminal.show();
terminal.sendText("javac " + context.extensionPath + "/Test/src/App.java");
terminal.sendText("java -cp " + context.extensionPath + "/Test/src/ App");
}
실행되었다.
(만약 터미널에 자바가 설치되지 않은경우는 자바를 설치하게 하고 싶다면 스크립트를 통해 자바 설치가 안된 경우 자바를 설치하도록 할 수있다.)
추가로 후에 작성하겠지만
다른 익스텐션과의 연동또는 설정을 통한다면
직접 복잡한 익스텐션, 코드를 구현하지 않아도 보다 쉽게 더 많은 것들을 할 수 있다.