파이썬 등 모바일 TypeScript로 쓴 프로그램의 마법'jsii'를 소개합니다.

14058 단어 TypeScriptPython
우선 결론부터 쓰면 아래 그림처럼 쓸 수 있다.

TypeScript로 작성된 프로그램은 아래 Python 프로그램에서 실행된 예입니다.
이 라이브러리는 jsii라는 라이브러리를 사용하여 TypeScript 프로그램을 Python 실행 가능한 라이브러리로 변환합니다.공식 문서에 the magic happens라고 적혀 있어요.는 마법 같은 기술이다.
jsii는 Python 이외에도 자바 등의 언어로 사용할 수 있지만, 본고에서는 Python으로 TypeScript로 쓴 프로그램을 실행합니다.
우리 실제로 한번 해 봅시다.

본문의 운행 환경

  • TypeScript 3.6.4
  • Python 3.7.5
  • Node.js 13.1.0
  • jsii로 해봐요.


    jsii는 대체로 다음과 같은 절차에 따라 사용할 수 있다.
  • TypeScript 컴파일러
  • jsii로 다른 언어 패키지 구축
  • 다른 언어로 설치
  • TypeScript 프로그램에 대한 설명


    예를 들어, TypeScript의 적절한 FizzBuzz 프로그램을 lib/index.ts에 설명합니다.
    lib/index.ts
    export class MyClass {
      fizzBuzz(arg: number): string {
        if (arg % (3 * 5) === 0) {
          return 'FizzBuzz';
        } else if (arg % 3 === 0) {
          return 'Fizz';
        } else if (arg % 5 === 0) {
          return 'Buzz';
        }
        return arg.toString();
      }
    }
    
    TypeScript의 정상적인 실행을 통해 동작을 확인하려면 $ npx ts-node lib/index.ts 등 원하는 방법으로 수행합니다.

    package.json 설명


    jsii는 구축할 때 package.json 정보를 사용하고 각 언어의 라이브러리에 로그인하는 메타정보를 사용합니다.따라서 어느 정도package.json가'좋다'고 쓰지 않으면 jsii를 움직일 수 없다.
    다음은 설정 예입니다.
    package.json
    {
      "name": "jsii-example",
      "version": "1.0.0",
      "main": "lib/index.js",
      "types": "lib/index.d.ts",
      "author": "your_name",
      "repository": {
        "url": "https://example.com",
        "type": "Git"
      },
      "license": "MIT",
      "jsii": {
        "outdir": "dist",
        "targets": {
          "python": {
            "distName": "your_name.jsii_example",
            "module": "your_name.jsii_example"
          }
        }
      },
      "devDependencies": {
        "jsii": "^0.20.6",
        "jsii-pacmak": "^0.20.6"
      }
    }
    
    위에서 말한 바와 같이repositoryauthor 등 평소에 생략하기 쉬운 부분은 jsii를 사용할 때 필수적이다.또한 maintypeslib/index.ts 과 같은 디렉토리에 지정해야 합니다.
    또한 jsii의 특정한 설정으로 jsii 이 곳에서 각 언어의 패키지 정보를 기술한다.이번에 Python의 소프트웨어 패키지를 구축하기 위해 targets 에서 python 모듈 이름의 정보를 기술하였다.

    jsii에서 구축


    설치jsii 구축에 필요한 패키지입니다.
    $ npm install --save-dev jsii jsii-pacmak
    $ echo "jsii
    wheel
    publication" > requirements.txt
    $ pip install --require requirements.txt
    
    상기 설치를 마친 후 jsii 명령으로 구축하고 jsii-pacmak 명령으로 포장한다.
    $ npx jsii
    $ npx jsii-pacmak
    
    dist/python 디렉터리에 your_name.jsii_example-1.0.0.tar.gz 를 만들면 성공합니다.

    Python에서 실행


    방금 만든 패키지 파일을 Python 라이브러리로 설치합니다.
    $ pip install dist/python/your_name.jsii_example-1.0.0.tar.gz
    
    import 이 라이브러리는 아까fizzz 함수를 호출한Python 프로그램을 기술합니다.
    python.py
    import your_name.jsii_example
    
    obj = your_name.jsii_example.MyClass()
    
    print(obj.fizz_buzz(2))
    print(obj.fizz_buzz(3))
    print(obj.fizz_buzz(5))
    print(obj.fizz_buzz(15))
    
    드디어 실행할 것이다.
    $ python python.py 
    2
    Fizz
    Buzz
    FizzBuzz
    
    TypeScript로 쓴 코드를 Python에서 호출할 수 있습니다!

    Docker에서 jsii 사용하기


    지금까지 설명한 실행 환경 구축은 여러 언어를 설치해야 하기 때문에 좀 번거롭기 때문에 이번jsii에 필요한 Python과 Node를 실행합니다.나는 js를 집중적으로 준비할 수 있는 Dockerfile을 준비했다.
    FROM python:3.7.5-slim
    
    ENV DIR /app
    WORKDIR $DIR
    RUN apt update && apt install -y nodejs npm
    
    # setup python
    COPY requirements.txt $DIR
    RUN pip install --requirement requirements.txt
    
    # setup node
    COPY package.json $DIR
    RUN npm install
    
    # main: lib/index.ts
    COPY lib/ $DIR/lib
    
    상기package.json,requirements.txt,lib/index.ts을 준비한 후 다음과 같이 사용합니다.
    $ mkdir dist
    $ docker build --tag jsii-example .
    $ docker run --rm --volume $(pwd)/dist:/app/dist jsii-example /bin/bash -c 'npx jsii && npx jsii-pacmak'
    
    dist/ 다음과 같은 패키지 파일이 생성되면 성공합니다.

    jsii의 구조


    jsii의 구조에 대해 jsii의 문서에 설명이 있습니다.
    jsii/runtime-architecture.md at master · aws/jsii
    Python 등 호스트 코드가 jsii 사용 위치에 도착했을 때 node의 하위 프로세스를 시작하고 프로그램을 실행합니다. 그 결과는 Python이 수신한 것 같습니다.호스트의 /tmp 디렉터리를 보면, 프로그램이 npm install에 잠시 있다고 느낄 수 있는 징후를 발견할 수 있습니다.
    원래 파이썬만 끝났는데 노드야.문서에서도 성능은 희생적이라고 언급했는데, 왜냐하면 이것은 js와의 통신에 의존하기 때문이다.jsii는 생산 환경 등 성능을 요구하는 응용 프로그램의 동작이 어려워 개발 및 구축용 도구 등에서 사용될 예정이다.

    jsii 이용례


    jsii는 AWS에서 개발한 OSS입니다.실제 사용례로 AWS에서 제공하는 Infrastructure as Code의 도구AWS CDK에서 jsii를 사용했다.aws-cdk는 jsii와 같고 TypeScript,Python입니다.이제 인프라 구성을 NET, Java로 설명할 수 있습니다.
    AWS 클라우드 개발 FAQ 참조
    AWS는 TypeScript를 통해 AWS 패킷의 업무 논리를 구축하고 지원하는 프로그래밍 언어마다 매핑을 제공합니다.이로써 AWS CDK 구축체의 행동이 서로 다른 언어 간에 일치하도록 확보하고 모든 언어에 사용할 수 있는 전면적인 구축 패키지를 제공할 수 있다.AWS CDK 프로젝트에서 생성된 모든 코드는 원하는 프로그래밍 언어를 기반으로 합니다.JavaScript가 실행될 때는 고객 프로그래밍 경험의 구현 세부 사항입니다.https://github.com/aws/jsii에서 jsii 프로젝트를 볼 수 있습니다.

    Tips

  • jsii에서 수행할 수 있는 TypeScript에 제한이 있음
  • 간단하고 알기 쉬운 예를 들어 TypeScript에서 다른 언어의 보존어를 사용하려고 시도할 때 정상적으로 작동하지 않을 수 있습니다.
  • 이 밖에 문서에 기타 제한이 열거되어 있습니다.
  • jsii/typescript-restrictions.md at master · aws/jsii
  • Python3.8은 지원되지 않음
  • 이 문서는 Python 3.7.5를 실행합니다.3.8.0을 사용하면 본문을 작성할 때 오류가 발생하여 jsii로 만든 라이브러리를 실행할 수 없습니다
  • issue도 서 있어요.
  • Python 3.8.0: ImportError: cannot import name '_Union' from 'typing' · Issue #913 · aws/jsii
  • Ruby 대응 개발 중
  • 문서에 명확하게 쓰여 있지는 않지만 History와 원본 코드를 읽으면 루비와 대응하는 기술들이 발견된다.
  • package.만약에 json내targets에서 ruby로 지정되면 jsii에서 정상적으로 작동하고 dist/ruby/에서 유사한 포장된 파일을 생성하지만 TypeScript 소스 코드가 포함된 프로그램만 이동하는 것 같아서gem의 생성을 실현하지 못했다.
  • issue 지원 Ruby
  • Ruby support · Issue #144 · aws/jsii
  • 총결산


    jsii를 사용하면 Python의 소스 코드에서 TypeScript 쓰기 프로그램을 실행할 수 있습니다.아직 개발 중인 부분의 제한이 많지만 실제로는 AWS CDK에서 사용되기 때문에 어느 정도 전망이 있다."여러 언어에서 하나의 코드를 바탕으로 만든 도구를 이용하고 싶다"면, 이 jsii는 선택할 수 있다고 생각합니다.
    이번에 사용한 프로그램도 GitHub에 업로드되었습니다.관심 있으신 분은 보세요.
    https://github.com/s2terminal/jsii-example

    좋은 웹페이지 즐겨찾기