BunPackage: pacotes npm pelo .csproj🌐 Esta página em: English · Português O eQuantic.UI permite declarar dependências de pacotes npm diretamente nos arquivos .csproj, mantendo a experiência de desenvolvimento 100% .NET, com zero package.json, zero npm e zero Node.js.
<BunPackage Include="dayjs" Version="1.11.13" />
É isso. No dotnet build, o SDK automaticamente:
1.
Gera um package.json temporário em obj/eQuantic/npm/
2.
Instala os pacotes usando o Bun embarcado
3.
Cria um symlink node_modules para as ferramentas resolverem
4.
Pula a instalação em builds incrementais
├── 1. ResolveBunPath ← Extrai o Bun embarcado do pacote NuGet
├── 2. InstallBunPackages ← NOVO: instala os itens <BunPackage>
│ ├── Cria obj/eQuantic/npm/package.json
│ ├── Roda: bun add <pacote>@<versão>
│ └── Symlink: node_modules → obj/eQuantic/npm/node_modules/
├── 3. CompileEQuanticUI ← C# → TypeScript → JavaScript
├── 4. CopyEQuanticRuntime ← Copia o runtime.js
├── MyApp.csproj ← BunPackage declarado aqui
├── node_modules/ ← Symlink (no gitignore)
│ └── → obj/eQuantic/npm/node_modules/
│ └── npm/ ← Escondido do desenvolvedor
│ ├── package.json ← Gerado automaticamente
│ ├── bun.lock ← Gerado automaticamente
│ └── node_modules/ ← Os pacotes de verdade
O desenvolvedor nunca vê nem toca no package.json. O symlink node_modules está no gitignore e é criado automaticamente.
Vários itens BunPackage são suportados. Cada um roda como um bun add separado:
<BunPackage Include="dayjs" Version="1.11.13" />
<BunPackage Include="marked" Version="15.0.6" />
Funciona igualmente bem com pacotes só de CSS importados via @import:
<BunPackage Include="tw-animate-css" Version="1.2.5" />
@import "tw-animate-css";
Detalhes do target MSBuild
O target InstallBunPackages vive no Sdk.targets:
<Target Name="InstallBunPackages"
AfterTargets="ResolveBunPath"
BeforeTargets="CompileEQuanticUI"
Condition="'@(BunPackage)' != '' And '$(BunPath)' != ''">
Incremental
Pula se obj/eQuantic/npm/node_modules/ já existir
Build limpo
Roda bun add para cada pacote no primeiro build ou depois de um dotnet clean
Multiplataforma
Symlink no macOS/Linux, mklink /D no Windows
Isolamento
Os pacotes vivem em obj/, não na raiz do projeto
Sem poluição
Nenhum package.json, bun.lockb ou node_modules comitado no git
Para forçar uma instalação nova (por exemplo, depois de trocar versões):
# Opção 1: apague o cache npm
# Opção 2: limpeza completa
Por que não gerar o package.json na raiz do projeto?
•
Polui o projeto .NET com artefatos npm
•
O desenvolvedor pode comitá-lo sem querer
•
Confunde as IDEs, que passam a tratá-lo como um projeto Node.js
•
Viola o princípio do "100% .NET"
Por que symlink em vez de NODE_PATH?
•
Symlinks são universalmente suportados pelas ferramentas que resolvem node_modules
•
O NODE_PATH tem comportamento inconsistente entre ferramentas
•
O symlink é transparente: se uma ferramenta procura node_modules/, ela encontra
Por que bun add em vez de bun install?
•
O bun add funciona com um package.json mínimo {"private": true}
•
O batching de itens do MSBuild (%(BunPackage.Identity)) mapeia naturalmente para chamadas individuais de bun add
•
Cada pacote é instalado na versão exata dele
Por que não usar bun x --install?
•
O bun x serve para rodar ferramentas de linha de comando, não para instalar bibliotecas
•
Pacotes referenciados em CSS (@plugin, @import) precisam existir em node_modules/
•
O bun add é a semântica correta para "instale esta biblioteca"
Abordagem
Precisa de package.json
Precisa de npm/Node.js
Experiência de desenvolvimento
npm tradicional
Sim
Sim
Precisa gerenciar dois ecossistemas
BunPackage
Não
Não
.NET puro, zero atrito
Os pacotes não atualizam depois de mudar a versão
Causa: o node_modules já existe, então o InstallBunPackages pula
Correção:
Erro de permissão de symlink no Windows
Causa: criar symlinks no Windows exige permissões elevadas ou o Modo de Desenvolvedor
Correção: ative o Modo de Desenvolvedor nas configurações do Windows, ou rode o terminal como Administrador