Extensibilidade — visão geral
Extensibilidade é um requisito central do Pipevine, não um recurso adicional. Esta página define cada ponto de extensão e o contrato que um pacote de terceiro precisa cumprir para adicionar vocabulário próprio ao YAML — sem fork do framework.
Princípio de desenho
Nenhum recurso do framework é implementado de um jeito que só o próprio Pipevine consiga replicar.
Se um step embutido precisa de algum gancho especial, esse gancho é parte da API pública — qualquer pacote de terceiro tem acesso exatamente ao mesmo mecanismo. Um step, provider de banco, broker, provider de cache ou esquema de autenticação escrito fora do repositório do Pipevine, consumindo apenas os pacotes NuGet publicados, tem o mesmo poder que um equivalente embutido.
Como uma extensão é ativada
Três passos, sempre os mesmos, para qualquer ponto de extensão:
- O consumidor referencia o pacote (
<PackageReference Include="Acme.Pipevine.Mongo" />). - O pacote registra suas implementações no DI, tipicamente via um método de extensão que o
próprio pacote expõe (
services.AddPipevineMongo()). - O YAML passa a poder usar a chave (
provider: mongodb,type: acme.enrich,scheme: hmac, conforme o ponto de extensão).
A resolução em runtime é por DI keyed services, com a chave sendo exatamente a string usada no YAML — não existe um registro central de "plugins conhecidos" para atualizar.
Se a chave aparece no YAML mas nenhuma implementação foi registrada, o erro é claro e aponta para a linha/coluna do documento:
orders.pipevine.yaml(14,20): error PV3010: nenhum provider de dados registrado
para a chave 'mongodb'. Referencie o pacote que a fornece.
Os pontos de extensão
| Interface | O que adiciona | Chave no YAML |
|---|---|---|
IStep |
Um novo passo de pipeline | type: |
IDataProvider |
Um novo banco de dados | provider: (em dataSources) |
IBrokerProvider |
Um novo broker de mensageria | provider: (em brokers) |
ICacheProvider |
Um novo backend de cache | provider: (em caches) |
IInboundAuthScheme |
Um novo esquema de autenticação de entrada | scheme: (em auth.schemes) |
IOutboundAuthProvider |
Autenticação para integrações de saída | scheme: (em integrations[].auth) |
IExpressionEngine |
Uma linguagem de expressão nova, ou funções adicionais na JSONata existente | engine: (default jsonata) |
IStepCodeEmitter |
Caminho rápido opcional de compile-time para um step existente | (acompanha o IStep correspondente) |
ISecretResolver |
Uma nova fonte de segredos | ${<chave>:...} |
Cada guia parte de um exemplo mínimo funcional, não de uma descrição abstrata da interface.
Estabilidade da API pública
- Toda superfície pública dos pacotes de abstração (
Pipevine.Abstractions,Pipevine.Data.Abstractions,Pipevine.Caching.Abstractions, e assim por diante) é rastreada explicitamente — qualquer adição é uma mudança revisável, nunca silenciosa. - SemVer estrito: quebra de contrato só acontece em uma versão major. Veja Versionamento para a política completa.
- Novos membros em interfaces são adicionados como default interface members sempre que possível, para não quebrar implementações de terceiro já existentes.
Diagnósticos para autores de extensão
Um analisador Roslyn dedicado emite a faixa PV4xxx para quem está escrevendo uma extensão —
referencie-o (com PrivateAssets="all") no .csproj do seu pacote de extensão:
| Código | Situação |
|---|---|
PV4001 |
Implementação de IStep sem o atributo [Step] |
PV4002 |
Campo mutável em uma implementação de IStep — quebra a garantia de thread-safety |
PV4010 |
IStepFactory sem schema de configuração declarado — impede validação do YAML no formato de schema (aviso, não bloqueia) |
PV4020 |
Chave de step colidindo com uma chave já registrada |
Para onde ir daqui
Escolha o ponto de extensão que sua extensão precisa e siga o guia correspondente — cada um começa com um exemplo completo e funcional: