Wenn Sie aus der Schlussfolgerung heraus schreiben, können Sie zunächst etwas wie die folgende Abbildung tun.
Dies ist ein Beispiel für die Ausführung des in TypeScript geschriebenen Programms, das oben vom Python-Programm unten angezeigt wird.
Es verwendet eine Bibliothek namens jsii, um ** TypeScript-Programme in Python-fähige Bibliotheken ** zu konvertieren. Wie die offizielle Dokumentation besagt, dass "die Magie passiert", ist es eine magische Technik.
jsii kann zusätzlich zu Python in Sprachen wie Java verwendet werden. In diesem Artikel wird jedoch ein in TypeScript geschriebenes Programm in Python ausgeführt.
Lass es uns tatsächlich tun.
Sie können jsii ungefähr im folgenden Ablauf verwenden.
Schreiben Sie als Beispiel ein geeignetes FizzBuzz-Programm in lib / index.ts
mit TypeScript.
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();
}
}
Wenn Sie den Vorgang überprüfen möchten, indem Sie ihn normal als TypeScript ausführen, führen Sie ihn mit Ihrer bevorzugten Methode aus, z. B. "$ npx ts-node lib / index.ts".
jsii verwendet die Informationen in package.json
zur Erstellungszeit, um Metainformationen für Bibliotheken in jeder Sprache zu registrieren. Daher kann jsii nur betrieben werden, wenn package.json
bis zu einem gewissen Grad" richtig "geschrieben ist.
Das Folgende ist ein Einstellungsbeispiel.
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"
}
}
Wie oben erwähnt, sind die Teile, die normalerweise weggelassen werden, wie "Repository" und "Autor", bei der Verwendung von jsii unverzichtbar. Außerdem müssen "main" und "types" im selben Verzeichnis wie "lib / index.ts" angegeben werden.
Beschreiben Sie außerdem als jsii-spezifische Einstellung die Informationen für jedes Sprachpaket an der Stelle mit dem Namen "jsii". Um das Python-Paket zu erstellen, werden die Modulnameninformationen dieses Mal als "Python" in "Zielen" beschrieben.
Installieren Sie die Pakete, die zum Ausführen des Builds "jsii" erforderlich sind.
$ npm install --save-dev jsii jsii-pacmak
$ echo "jsii
wheel
publication" > requirements.txt
$ pip install --require requirements.txt
Erstellen Sie nach Abschluss der obigen Installation mit dem Befehl jsii
und verpacken Sie mit dem Befehl jsii-pacmak
.
$ npx jsii
$ npx jsii-pacmak
Es ist erfolgreich, wenn "your_name.jsii_example-1.0.0.tar.gz" im Verzeichnis "dist / python" erstellt wird.
Installieren Sie die zuvor als Python-Bibliothek erstellte Paketdatei.
$ pip install dist/python/your_name.jsii_example-1.0.0.tar.gz
Importieren Sie diese Bibliothek und schreiben Sie ein Python-Programm, das die Funktion fizzBuzz aufruft.
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))
Es ist endlich Zeit zu rennen.
$ python python.py
2
Fizz
Buzz
FizzBuzz
Ich konnte in TypeScript geschriebenen Code aus Python aufrufen!
Da die bisher beschriebene Ausführung der Ausführungsumgebung die Installation mehrerer Sprachen erfordert, ist dies etwas mühsam. Daher haben wir dieses Mal eine Docker-Datei vorbereitet, mit der Python und Node.js vorbereitet werden können, die für die gemeinsame Ausführung von "jsii" erforderlich sind.
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
Nachdem Sie das oben erwähnte "package.json", "require.txt", "lib / index.ts" vorbereitet haben, verwenden Sie es wie folgt.
$ 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'
Es ist erfolgreich, wenn die Paketdatei unter dist / generiert wird.
Der Mechanismus von jsii wird in der jsii-Dokumentation erläutert. jsii/runtime-architecture.md at master · aws/jsii
Wenn der Hostcode wie Python den jsii-Verwendungspunkt erreicht, wird anscheinend der untergeordnete Prozess des Knotens gestartet, das Programm ausgeführt und das Ergebnis von Python empfangen. Wenn Sie im Verzeichnis / tmp
auf Ihrem Host nachsehen, finden Sie Hinweise auf eine vorübergehende npm-Installation des Programms.
In der Dokumentation heißt es außerdem, dass die Leistung beeinträchtigt wird, da die Verarbeitung, die ursprünglich mit Python endet, auch von der Kommunikation mit Node.js abhängt. Es ist schwierig für jsii, in Anwendungen zu arbeiten, die Leistung erfordern, wie z. B. Produktionsumgebungen, und es wird erwartet, dass es in Entwicklungs- und Build-Tools verwendet wird.
jsii ist ein von AWS entwickeltes OSS. Als aktuelles Verwendungsbeispiel wird jsii in AWS CDK verwendet, einem von AWS bereitgestellten Tool für Infrastruktur als Code. Wie bei jsii können Sie mit aws-cdk Infrastrukturkonfigurationen in TypeScript, Python, .NET und Java schreiben.
Zitiert aus Häufig gestellte Fragen zur AWS Cloud-Entwicklung
AWS erstellt die Geschäftslogik des AWS Construct-Bibliothekspakets in TypeScript und bietet eine Zuordnung zu jeder unterstützten Programmiersprache. Dies stellt sicher, dass sich AWS CDK-Konstrukte in verschiedenen Sprachen konsistent verhalten und einen umfassenden Satz von Konstruktpaketen bereitstellen können, die in allen Sprachen verfügbar sind. Der gesamte im AWS CDK-Projekt erstellte Code stammt ursprünglich aus der Programmiersprache Ihrer Wahl. Die JavaScript-Laufzeit ist eine detaillierte Implementierung Ihrer Programmiererfahrung. Das jsii-Projekt finden Sie unter https://github.com/aws/jsii.
Tips
ruby
in destination
angeben, funktioniert jsii
ordnungsgemäß und indist / ruby /
wird eine paketähnliche Datei generiert, aber TypeScript-Quellcode wird unverändert verwendet. Zu enthaltende Programme scheinen ausgeführt zu werden und die Generierung von Edelsteinen ist implementiert Ist nicht ...Mit jsii konnte ich ein in TypeScript geschriebenes Programm im Python-Quellcode ausführen. Obwohl es sich noch in der Entwicklung befindet und viele Einschränkungen aufweist, hat es eine gewisse Zukunft, da es tatsächlich im AWS CDK verwendet wird. Wenn Sie ein Tool verwenden möchten, das mit einer Codebasis aus mehreren Sprachen erstellt wurde, ist dieses jsii meiner Meinung nach eine Option.
Das diesmal verwendete Programm ist auch auf GitHub veröffentlicht. Wenn Sie interessiert sind, schauen Sie bitte. https://github.com/s2terminal/jsii-example
Recommended Posts