이 기사는 Deno로 뛰어 들어 파일 및 폴더에서 텍스트를 검색하기위한 명령 줄 도구를 만듭니다. 우리는 Deno가 제공 한 다양한 API 방법을 사용하여 파일 시스템을 읽고 씁니다.
이전 기사에서는 Deno를 사용하여 명령 줄 도구를 구축하여 타사 API에 요청했습니다. 이 기사에서는 네트워크 운영을 일시적으로 무시하고 현재 디렉토리 (GREP와 같은 도구)의 파일 및 폴더에서 텍스트를 검색 할 수있는 도구를 구축합니다.
참고 : 우리가 구축 한 도구는 GREP만큼 최적화되고 효율적이지 않으며, 우리는 그것을 대체하려는 것을 목표로하지 않습니다! 그러한 도구를 구축하는 목적은 Deno의 파일 시스템 API에 익숙해야합니다.
키 포인트
Deno의 파일 시스템 API는 GREP 도구와 유사하지만 최적화되지 않은 파일 및 디렉토리에서 텍스트를 검색하기위한 명령 줄 도구를 만드는 데 도움이됩니다.
Deno에서 Yargs를 사용하여 개발자는 명령 줄 애플리케이션을위한 사용자 인터페이스를 구축하여 지정된 디렉토리에서 텍스트 검색을 허용 할 수 있습니다.
Deno는 파일 목록의 경우 와 같은 내장 기능을 제공하고 파일 내용을 읽는 경우
를 제공하므로 추가 가져 오기없이 파일 시스템 상호 작용을 단순화합니다.
Deno의 경로 모듈을 사용하여 파일 경로를 연결하기위한 와 같은 함수를 포함하여 파일 경로를 효율적으로 관리 할 수 있습니다. -
Deno 스크립트는 파일 시스템 작업을 수행하기 위해
또는 와 같은 명백한 권한 플래그가 필요하며, 이는 스크립트 기능을 제어하여 보안을 향상시킵니다. -
개발자는
를 사용하여 데노 스크립트를 별도의 실행 파일로 컴파일하여 필요한 권한을 캡슐화하여 분포와 실행을 단순화 할 수 있습니다. -
Deno.readDir
설치 DENO Deno.readTextFile
우리는 당신이 당신의 로컬 기계에서 Deno를 실행하고 있다고 가정합니다. 더 자세한 설치 지침과 편집자에 Deno 지원을 추가하는 방법에 대한 자세한 내용은 Deno 웹 사이트 또는 이전 기사에서 확인할 수 있습니다.
글을 쓰는 시점에서 Deno의 최신 안정 버전은 1.10.2 로이 기사에서 사용하는 버전입니다. -
참조의 경우 GitHub 에서이 기사의 전체 코드를 찾을 수 있습니다.
path.join
yargs 로 새로운 명령을 설정하십시오
이전 게시물에서와 같이 Yargs를 사용하여 사용자가 도구를 실행하는 데 사용할 수있는 인터페이스를 작성합니다. index.ts를 만들고 다음과 같이 채우십시오 : </previous></s></you>
</li>
<li>
<lot> 여기에 지적해야 할 것이 많다 : <code>–allow-read</code><ul>
<ar> 우리는 데노 저장소의 경로를 가리켜 yargs를 설치합니다. 정확한 버전 번호를 명시 적으로 사용하여 스크립트가 실행될 때 최신 버전을 사용하지 않도록 항상 해당 버전을 얻을 수 있습니다. <li>
<of> 글을 쓰는 시점에서 Deno TypeScript는 Yargs에 대한 좋은 경험을하지 않았으므로 나만의 인터페이스를 만들어 일부 유형의 안전을 제공하는 데 사용했습니다. </of>
</li>
<uments> userArguments에는 사용자가 요청할 모든 입력이 포함되어 있습니다. 현재 텍스트 입력 만 요구하지만 앞으로는 현재 디렉토리를 가정하지 않고 검색 할 파일 목록을 제공하기 위해 확장 할 수 있습니다. <li>
</li>
<it> 우리는 Deno Run Index.ts로 실행할 수 있으며 Yargs 출력을 볼 수 있습니다.
<li>
<to> 구현을 시작할 시간입니다! </to>
</li>
파일을 나열하십시오
<search> 주어진 파일에서 텍스트 검색을 시작하기 전에 검색 할 디렉토리 및 파일 목록을 생성해야합니다. Deno는 "내장 된"라이브러리의 일부인 DeNo.Readdir를 제공하므로 가져올 필요가 없습니다. 글로벌 네임 스페이스에서 사용할 수 있습니다. </search></it></uments></ar>
</ul>
<read> deno.readdir는 비동기식이며 현재 디렉토리에서 파일 및 폴더 목록을 반환합니다. 이 항목을 Asynciterator로 반환합니다. 즉, 결과를 얻기 위해 루프를 기다려야합니다.
<p>
이 코드는 현재 작업 디렉토리 (DeNo.cwd ()에서 제공)에서 각 결과를 읽고 기록합니다. 그러나 지금 스크립트를 실행하려고하면 오류가 발생합니다.
</p>
<o> Deno는 모든 스크립트가 파일 시스템에서 읽을 권한을 명시 적으로 얻어야한다는 것을 기억하십시오. 우리의 경우 플래그는 코드를 실행할 수 있습니다.
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>import yargs from "https://deno.land/x/yargs@v17.0.1-deno/deno.ts";
interface Yargs<argvreturntype></argvreturntype> {
describe: (param: string, description: string) => Yargs<argvreturntype>;
</argvreturntype> demandOption: (required: string[]) => Yargs<argvreturntype>;
</argvreturntype> argv: ArgvReturnType;
}
interface UserArguments {
text: string;
}
const userArguments: UserArguments =
(yargs(Deno.args) as unknown as Yargs<userarguments>)
</userarguments> .describe("text", "the text to search for within the current directory")
.demandOption(["text"])
.argv;
console.log(userArguments);
로그인 후 복사
로그인 후 복사
이 경우 빌드 도구의 디렉토리에서 스크립트를 실행하므로 TS 소스 코드, .git 리포지토리 및 .vscode 폴더를 찾습니다. 최상위 파일뿐만 아니라 디렉토리에서 모든 파일을 찾아야하기 때문에이 구조를 재귀 적으로 탐색하기위한 일부 기능을 작성하겠습니다. 또한, 우리는 공통 무시를 추가 할 수 있습니다. 나는 아무도 스크립트가 전체 .git 폴더를 검색하기를 원할 것이라고 생각하지 않습니다!
다음 코드에서는 디렉토리를 가져 와서 해당 디렉토리의 모든 파일을 반환하는 getFilesList 함수를 만듭니다. 디렉토리가 발생하면 중첩 된 파일을 찾아 결과를 반환하기 위해 재귀 적으로 호출합니다.