Proyectos Smithy
Smithy es un lenguaje de definición de interfaces para describir servicios y los datos que intercambian. El generador de proyectos Smithy crea un proyecto que contiene un modelo Smithy.
Hay dos tipos de proyecto Smithy:
- Service (
--type=service) — un modelo que define un servicio y sus operaciones. Esto es lo que el generadorts#api --framework=smithycrea para ti junto con una implementación TypeScript. - Shape library (
--type=shapes) — un modelo que define formas reutilizables pero ningún servicio. Conecta una biblioteca de formas a tus proyectos Smithy para compartir formas entre ellos, en lugar de duplicar las definiciones en cada uno.
Generar un Proyecto Smithy
Sección titulada «Generar un Proyecto Smithy»- Instale el Nx Console VSCode Plugin si aún no lo ha hecho
- Abra la consola Nx en VSCode
- Haga clic en
Generate (UI)en la sección "Common Nx Commands" - Busque
@aws/nx-plugin - smithy#project - Complete los parámetros requeridos
- name: my-shapes
- Haga clic en
Generate
pnpm nx g @aws/nx-plugin:smithy#project --name=my-shapesyarn nx g @aws/nx-plugin:smithy#project --name=my-shapesnpx nx g @aws/nx-plugin:smithy#project --name=my-shapesbunx nx g @aws/nx-plugin:smithy#project --name=my-shapesTambién puede realizar una ejecución en seco para ver qué archivos se cambiarían
pnpm nx g @aws/nx-plugin:smithy#project --name=my-shapes --dry-runyarn nx g @aws/nx-plugin:smithy#project --name=my-shapes --dry-runnpx nx g @aws/nx-plugin:smithy#project --name=my-shapes --dry-runbunx nx g @aws/nx-plugin:smithy#project --name=my-shapes --dry-runOpciones
Sección titulada «Opciones»| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| name Requerido | string | - | Nombre del proyecto Smithy |
| type | service | shapes | service | El tipo de proyecto Smithy a crear. Elija entre service (un modelo con una forma de servicio, listo para una implementación) y shapes (una biblioteca de formas reutilizables, compartida entre múltiples proyectos Smithy). |
| serviceName | string | - | El nombre de su servicio Smithy. Utiliza el nombre proporcionado por defecto. No aplicable a bibliotecas de formas. |
| namespace | string | - | El namespace para la API Smithy. Por defecto es el scope de tu monorepo |
| directory | string | packages | Directorio padre donde se coloca el proyecto Smithy. |
| subDirectory | string | - | El subdirectorio donde se coloca el proyecto Smithy. Por defecto es el nombre del proyecto. |
| preferInstallDependencies | boolean | true | Si se prefiere instalar las dependencias después de que se ejecute el generador. Establece en false para diferir la instalación cuando se ejecutan múltiples generadores en lote (la instalación aún se ejecuta si es necesario para que los generadores subsiguientes puedan calcular el grafo de proyectos de Nx); instala una vez al final. |
Salida del Generador
Sección titulada «Salida del Generador»Biblioteca de Formas
Sección titulada «Biblioteca de Formas»Directoriomy-shapes
Directoriosrc
- main.smithy Tus definiciones de formas compartidas
- smithy-build.json Configuración de compilación de Smithy
- build.Dockerfile Compila y valida el modelo
- project.json Configuración del proyecto y objetivos de compilación
Una biblioteca de formas define formas y nada más:
$version: "2.0"
namespace com.example
structure Customer { @required id: String
name: String email: String}Dado que una biblioteca de formas no tiene servicio, su smithy-build.json no configura generación de código — compilarla valida el modelo y lo ensambla en un único archivo de modelo JSON en dist/<my-shapes>/build/model/model.json.
Servicio
Sección titulada «Servicio»Directoriomy-service
Directoriosrc
- main.smithy Tu definición de servicio
Directoriooperations
- echo.smithy Una operación de ejemplo
- smithy-build.json Configuración de compilación de Smithy, incluyendo generación de código
- build.Dockerfile Compila el modelo, especificación OpenAPI y TypeScript Server SDK
- project.json Configuración del proyecto y objetivos de compilación
Un modelo de servicio define una forma de servicio y las operaciones que expone:
$version: "2.0"
namespace com.example
use aws.protocols#restJson1
@title("MyService")@restJson1service MyService { version: "1.0.0" operations: [ Echo ]}Compilar un proyecto de servicio genera una especificación OpenAPI y un TypeScript Server SDK en dist/<my-service>/build/.
Compilación
Sección titulada «Compilación»Los proyectos Smithy se compilan usando Docker, que ejecuta el Smithy CLI para validar tu modelo:
pnpm nx build my-shapesyarn nx build my-shapesnpx nx build my-shapesbunx nx build my-shapesDependiendo de una Biblioteca de Formas
Sección titulada «Dependiendo de una Biblioteca de Formas»Compilar una biblioteca de formas escribe un modelo ensamblado en dist/<my-shapes>/build/model/model.json. Este único archivo contiene cada forma que la biblioteca define, junto con cualquiera de la que dependa, por lo que un consumidor solo declara las bibliotecas que referencia directamente.
Para depender de una biblioteca de formas desde otro proyecto Smithy, realiza tres cambios en el proyecto consumidor:
-
Los proyectos Smithy se compilan dentro de un contenedor, y la compilación recibe la raíz del espacio de trabajo como un contexto de compilación nombrado. Agrega un
COPYalbuild.Dockerfiledel proyecto consumidor, junto a donde se copian sus propias fuentes:# Copy project filesCOPY smithy-build.json .COPY src srcCOPY --from=workspace dist/packages/my-shapes/build/model/model.json deps/my-shapes.json -
Agrega el archivo copiado a
importsen elsmithy-build.jsondel proyecto consumidor:{"version": "1.0","sources": ["src/"],"imports": ["deps/my-shapes.json"],...} -
Agrega el objetivo
buildde la biblioteca como una dependencia del objetivocompiledel proyecto consumidor en suproject.json, para que el modelo exista antes de que el consumidor compile:{"targets": {"compile": {"dependsOn": ["@my-scope/my-shapes:build"],...}}}
Tu modelo ahora puede referenciar las formas de la biblioteca con use:
$version: "2.0"
namespace com.example.api
use com.example.shared#Customer
structure GetCustomerOutput { @required customer: Customer}Las bibliotecas de formas pueden depender de otras bibliotecas de formas de la misma manera. Dado que el modelo compilado de cada biblioteca ya contiene sus propias dependencias, solo necesitas repetir estos pasos para las bibliotecas que referencias directamente. Una biblioteca alcanzada por más de una ruta se resuelve una vez — Smithy ignora definiciones de formas duplicadas pero equivalentes.