Tout d'abord, si vous écrivez à partir de la conclusion, vous pouvez faire quelque chose comme la figure ci-dessous.
Ceci est un exemple d'exécution du programme écrit en TypeScript affiché sur la face supérieure du programme Python sur la face inférieure.
Il utilise une bibliothèque appelée jsii pour convertir ** les programmes TypeScript en bibliothèques compatibles Python **. Comme le document officiel dit "la magie opère", c'est une technique magique.
jsii peut être utilisé dans des langages tels que Java en plus de Python, mais dans cet article, un programme écrit en TypeScript est exécuté en Python.
Faisons-le réellement.
Vous pouvez utiliser jsii à peu près dans le flux suivant.
À titre d'exemple, écrivez un programme FizzBuzz approprié dans lib / index.ts
avec 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();
}
}
Si vous voulez vérifier l'opération en l'exécutant normalement en tant que TypeScript, exécutez-la par votre méthode préférée telle que $ npx ts-node lib / index.ts
.
jsii utilise les informations de package.json
au moment de la construction pour enregistrer les méta-informations des bibliothèques dans chaque langue. Par conséquent, jsii ne peut pas être utilisé à moins que package.json
ne soit écrit" correctement "dans une certaine mesure.
Voici un exemple de réglage.
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"
}
}
Comme mentionné ci-dessus, les parties qui sont généralement omises telles que «référentiel» et «auteur» sont requises lors de l'utilisation de jsii. De plus, les types «main» et «types» doivent être spécifiés dans le même répertoire que «lib / index.ts».
De plus, en tant que paramètre spécifique à jsii, décrivez les informations pour chaque package de langue à l'emplacement appelé jsii
. Cette fois, afin de construire le package Python, les informations sur le nom du module sont décrites comme «python» dans les «cibles».
Installez les packages requis pour exécuter la compilation jsii
.
$ npm install --save-dev jsii jsii-pacmak
$ echo "jsii
wheel
publication" > requirements.txt
$ pip install --require requirements.txt
Une fois l'installation ci-dessus terminée, compilez avec la commande jsii
et le package avec la commande jsii-pacmak
.
$ npx jsii
$ npx jsii-pacmak
Il réussit si votre_nom.jsii_example-1.0.0.tar.gz
est créé dans le répertoire dist / python
.
Installez le fichier de package créé précédemment en tant que bibliothèque Python.
$ pip install dist/python/your_name.jsii_example-1.0.0.tar.gz
Importez cette bibliothèque et écrivez un programme Python qui appelle la fonction fizzBuzz.
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))
Il est enfin temps de courir.
$ python python.py
2
Fizz
Buzz
FizzBuzz
J'ai pu appeler du code écrit en TypeScript depuis Python!
Puisque la construction de l'environnement d'exécution décrite jusqu'à présent nécessite l'installation de plusieurs langages, c'est un peu gênant, donc cette fois nous avons préparé un Dockerfile qui peut préparer Python et Node.js requis pour l'exécution de jsii
ensemble.
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
Après avoir préparé le package.json
, requirements.txt
, lib / index.ts
mentionné ci-dessus, utilisez-le comme suit.
$ 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'
Il réussit si le fichier de package est généré sous dist /
.
Le mécanisme de jsii est expliqué dans la documentation jsii. jsii/runtime-architecture.md at master · aws/jsii
Lorsque le code hôte tel que Python atteint le point d'utilisation jsii, il semble que le processus enfant du nœud est démarré, le programme est exécuté et le résultat est reçu par Python. Si vous regardez dans le répertoire / tmp
sur votre hôte, vous trouverez la preuve d'une installation npm temporaire du programme.
La documentation indique également que ** les performances sont sacrifiées ** car le traitement qui se termine à l'origine avec Python dépend également de la communication avec Node.js. Il est difficile pour jsii de fonctionner dans des applications qui nécessitent des performances telles que des environnements de production, et il devrait être utilisé dans les outils de développement et de construction.
jsii est un OSS développé par AWS. À titre d'exemple d'utilisation réel, jsii est utilisé dans AWS CDK, qui est un outil d'infrastructure en tant que code fourni par AWS. Comme jsii, aws-cdk vous permet d'écrire des configurations d'infrastructure en TypeScript, Python, .NET et Java.
Cité dans AWS Cloud Development Foire aux questions
AWS crée la logique métier du package de bibliothèque AWS Construct dans TypeScript et fournit un mappage vers chaque langage de programmation pris en charge. Cela garantit que les constructions AWS CDK se comportent de manière cohérente dans différentes langues et peuvent fournir un ensemble complet de packages de construction disponibles dans toutes les langues. Tout le code créé dans le projet AWS CDK est natif du langage de programmation de votre choix. Le runtime JavaScript est une implémentation détaillée de votre expérience de programmation. Le projet jsii peut être trouvé à https://github.com/aws/jsii.
Tips --Il existe des restrictions sur le TypeScript qui peuvent être exécutées avec jsii.
ruby
dans cibles
dans package.json, jsii
fonctionne correctement et un fichier de type package est généré dansdist / ruby /
, mais le code source TypeScript est utilisé tel quel. Programmes à inclure semble être en cours d'exécution et la génération de gemmes est implémentée N'est pas ...
--Il y a un problème concernant le support Ruby
- Ruby support · Issue #144 · aws/jsiiEn utilisant jsii, j'ai pu exécuter un programme écrit en TypeScript dans le code source Python. Bien qu'il soit encore en cours de développement et soumis à de nombreuses restrictions, il a un certain avenir car il est en fait utilisé dans AWS CDK. Si vous souhaitez utiliser un outil créé avec une base de code à partir de plusieurs langues, je pense que ce jsii est une option.
Le programme utilisé cette fois est également posté sur GitHub. Si vous êtes intéressé, jetez un œil. https://github.com/s2terminal/jsii-example
Recommended Posts