나만의 git 작성하기(typescript로) - 파트 1

7221 단어 gitnodetypescriptvcs
git에 대한 이 인용문은 저에게 영감을 주었습니다.

The combination of core simplicity and powerful applications often makes thing[s] really hard to grasp, because of the mental jump required to derive the variety of applications from the essential simplicity of the fundamental abstraction (monads, anyone?)



Python에서 자신의 git을 작성하는 방법tutorial에서 가져온 것으로 TypeScript로 포팅하기로 결정했습니다.

이번 게시물과 다음 게시물에서는 튜토리얼을 살펴보고 8단계로 완료할 것입니다. 가능한 한 강력하게 입력된 코드를 찾을 수 있습니다here. 이 튜토리얼은 결과 앱을 "모든 기능을 갖춘 git 라이브러리 및 CLI로"업그레이드하는 작업을 독자에게 맡기므로 끝까지는 아니더라도 한 단계 더 나아가도록 노력할 것입니다.

우리는 댄스?

0 - 의도된 청중



NodeJS에 익숙하고 파일 시스템에 대한 기본적인 이해가 있는 중급 JS/TS 개발자. 언어를 배우는 TypeScript 애호가.

1 - 시작하기



아이디어는 wyag를 모방하는 TypeScript에서 Node.js 앱을 만드는 것입니다. 이를 위해서는 TypeScript에 CLI 인터페이스가 필요합니다.

Node로 CLI를 생성하는 방법this tutorial을 따랐으며 아래 프로세스를 요약합니다.

초기화



폴더에서 npm init를 수행한 다음 package.json에 다음 종속성을 추가합니다.

  • clear - 화면 지우기,

  • figlet - Schwaaag용 ASCII 아트,

  • chalk - 터미널 스타일링

  • commander - 인수용

  • path - 파일 및 디렉토리 경로 작업용

  • 및 다음 devDependencies:

  • @types/node - Node.js에 대한 유형 정의

  • nodemon - 이것이 무엇인지 모른다면 지금이 이 튜토리얼 읽기를 중단하고 다른 일을 할 때입니다
  • .

  • ts-node - 실행 환경 및 REPL(REPL을 Google에 검색해야 하는 경우 진지하게 다른 작업을 수행하십시오.)

  • typescript - ❤️

  • 스크립트


    package.json의 스크립트 섹션은 다음과 같아야 합니다.

    "scripts": {
      "start": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts",
      "create": "npm run build && npm run test",
      "build": "tsc -p .",
      "test": "sudo npm i -g && pizza",
      "refresh": "rm -rf ./node_modules ./package-lock.json && npm install"
    },
    

    TSconfig


    tsconfig.json와 같은 폴더에 다음 내용이 포함된 package.json 파일도 필요합니다.

    {
      "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "lib": ["es6", "es2015", "dom"],
        "declaration": true,
        "outDir": "lib",
        "rootDir": "src",
        "strict": true,
        "types": ["node"],
        "esModuleInterop": true,
        "resolveJsonModule": true
      }
    }
    

    CLI 생성



    디렉터리에 src 폴더를 만들고 그 안에 index.ts라는 파일을 만듭니다. 그런 다음 편집을 시작합니다.

    우리는 정상적인 shebang으로 시작합니다.

    #!/usr/bin/env node
    

    화면 지우기:

    clear()
    

    종속성을 가져옵니다.

    const chalk = require('chalk');
    const clear = require('clear');
    const figlet = require('figlet');
    const path = require('path');
    const program = require('commander');
    

    배너 표시:

    console.log(
      chalk.green(
        figlet.textSync('sustain', { font: 'slant', horizontalLayout: 'full' })
      ));
    

    처리할 CLI 앱에 명령/인수를 추가합니다.

    program
      .version('0.0.1')
      .description('A distributed version control system')
      .option('-i, --init', 'Init a repo')
      .option('-a, --add', 'Add file')
      .option('-c, --cat', 'Cat file')
      .option('-t, --checkout', 'Checkout')
      .option('-m, -commit', 'Commit')
      .option('-h, -hash', 'Hash Object')
      .option('-l, -log', 'Log')
      .option('-t, -ls-tree', 'Hash Object')
      .option('-h, -hash', 'Hash Object')
      .option('-g, -merge', 'Merge')
      .option('-r, -rebase', 'Rebase')
      .option('-v, -rev', 'Rev parse')
      .option('-r, -rm', 'Remove')
      .option('-s, -show', 'Show ref')
      .option('-t, -tag', 'Tag')
      .parse(process.argv);
    

    다음으로 사용자가 보낸 인수에 대한 몇 가지 자리 표시자 작업을 원합니다. 여기로 돌아와 각 항목에 대한 함수를 작성합니다.

    if (program.init) console.log(' - Initialize a repo');
    if (program.add) console.log('  - Add file');
    if (program.cat) console.log('  - Cat file');
    if (program.checkout) console.log('  - Checkout');
    if (program.commit) console.log('  - Commit');
    if (program.hash) console.log('  - Hash object');
    if (program.log) console.log('  - Log');
    if (program.lstree) console.log(' - Show dir tree');
    if (program.merge) console.log('  - Merge');
    if (program.rebase) console.log('  - Rebase');
    if (program.rparse) console.log('  - Rev parse');
    if (program.rm) console.log(' - Remove');
    if (program.show) console.log('  - Show ref');
    if (program.tag) console.log('  - Tag');
    

    마지막으로 다음을 추가하여 사용자에게 도움이 필요한 경우 필수-h--help 인수를 구현합니다.

    if (!process.argv.slice(2).length) {
      program.outputHelp();
    }
    

    이제 npm run build를 수행하고 프로그램을 호출하면 다음과 같은 내용이 표시됩니다.


    다음 부분에서는 기본 빌딩 블록인 SusRepository 클래스를 프로그램에 추가합니다. 또한 코드에 몇 가지 유틸리티 기능을 추가할 것입니다. 그런 다음 init 명령을 구현하고 RepoFind 기능에 대한 git 디렉토리를 재귀적으로 찾는 init 함수를 작성합니다.

    내 블로그용으로 작성된 원본 기사를 읽을 수 있습니다here .

    좋은 웹페이지 즐겨찾기