Introducción
Qué hace PCPM por ti, los problemas que resuelve y cómo se relaciona con pnpm, CPM y el ecosistema NuGet.
PCPM es un gestor de paquetes direccionable por contenido para .NET, construido sobre Central Package Management. Lleva al ecosistema NuGet las partes de pnpm que de verdad mueven la aguja: un store global, hardlinks, un lockfile con hash de contenido y resolución estricta.
PCPM no inventa un nuevo formato de manifiesto. Escribe el mismo
Directory.Packages.props y los mismos <PackageReference /> que ya
usas. dotnet restore sigue haciendo el restore; MSBuild sigue
compilando. PCPM solo cambia de dónde vienen los bytes, qué versión se
fija y qué se ejecuta en CI.
Qué hace por ti, concretamente
Estas son las razones por las que la gente se pasa a PCPM. El resto de la documentación entra en detalle sobre cada una.
70–90% menos de disco en la caché de NuGet
Sin PCPM, cada (id, version) distinto se desempaqueta una vez por
proyecto en ~/.nuget/packages. En un monorepo de 30 proyectos con 200
paquetes únicos, eso son ~8 GB de bytes duplicados aunque el contenido
sea byte-idéntico.
Con PCPM, cada .nupkg distinto vive una sola vez en un store
direccionable por contenido, enlazado con hardlinks a
~/.nuget/packages. El store no crece con el número de proyectos.
Builds reproducibles, de verdad
pcpm.lock registra la versión resuelta y el sha256 del .nupkg
de cada entrada. pcpm ci es el comando para el build server: rechaza
continuar si el lockfile está obsoleto, falta o tiene hashes que no
coinciden con el store. Un run limpio de CI que resuelva un transitivo
nuevo se convierte en fallo de build, no en regresión silenciosa.
Restauraciones limpias en CI que no son lentas
La primera install descarga el mundo. Cada install posterior — incluso en un runner limpio con caché caliente — solo trae los deltas. El paso del hardlink es solo metadatos.
Te dice quién metió qué
pcpm why <paquete> recorre el lockfile y muestra la cadena completa
de dependientes que trajo <paquete> a tu build. Cuando un bump
transitivo te sorprende, sabes exactamente con qué dependencia directa
negociar.
Diagnostica tu CPM antes de que CI lo haga por ti
pcpm doctor ejecuta una batería de comprobaciones contra el workspace
actual y sale con código distinto de cero ante problemas reales: falta
de ManagePackageVersionsCentrally, versiones flotantes, Version=
hardcodeado en <PackageReference />, entradas huérfanas, entradas
faltantes, drift del lockfile y CVEs conocidos desde el feed de NuGet.
Conéctalo a la puerta de calidad de tu build.
Audita seguridad y licencias, y entrega un SBOM
pcpm audit escanea el grafo resuelto contra avisos de vulnerabilidades
y metadatos de licencia. --output <dir> escribe un SBOM CycloneDX y
un informe de licencias. Tiene modo de salida JSON para pipe en CI.
Migra soluciones existentes con un comando
pcpm convert recorre una solución (con o sin CPM) y la reescribe
in-place: sube cada Version= por proyecto a un <PackageVersion />,
adopta un Directory.Packages.props existente si lo hay y escribe
pcpm.json + pcpm.lock. --dry-run previsualiza el diff; --revert
deshace un convert anterior.
Cómo funciona por dentro
PCPM es una capa fina sobre el SDK de .NET. El flujo es:
pcpm installleeDirectory.Packages.propsy los.csprojdescubiertos, y resuelve el grafo transitivo completo usando la misma libreríaNuGet.Versioningque usadotnet restore— por eso el parseo de rangos, el manejo de pre-releases y la semántica de flotantes se mantienen consistentes.- Cada
.nupkgresuelto se descarga una vez, se hashea y se almacena bajo su hash de contenido en el store global. - El paquete se enlaza con hardlinks (NTFS / APFS / ext4) desde el
store hasta el layout estándar
~/.nuget/packages/<id>/<version>/. dotnet restorelee el layout estándar; nada en el lado del consumidor es custom.pcpm.lockregistra la versión resuelta y el sha256 del.nupkgde cada entrada.
Los hardlinks son gratis — cero disco extra, materialización
instantánea. dotnet restore ve un layout de NuGet perfectamente
normal, así que toda la magia de MSBuild sigue funcionando.
Un tour de 30 segundos
# En un checkout fresco de tu proyecto .NET:
pcpm convert # migra una solución existente, o…
pcpm init # …arranca limpio en un workspace nuevo
pcpm add Serilog # última estable → CPM + .csproj
pcpm install # hidrata el store, hardlinks, dotnet restore
pcpm why Serilog # quién la trajo
pcpm doctor # chequeo de CPM + lockfile + CVEs
pcpm audit # vulnerabilidades + informe de licencias + SBOM
pcpm outdated # versiones más nuevas en el feed
pcpm ci # instalación estricta para CI
Sin demonio, sin servicio en segundo plano, sin migración de manifiestos.
Siguientes pasos
- Instalación — pon
pcpmen tuPATH. - Inicio rápido — el camino más rápido a una configuración funcional.
- Migrar desde CPM — convierte una solución existente.
- Almacén direccionable por contenido — la parte de PCPM que hace el trabajo pesado en disco.
- Integración con CI —
pcpm cipara builds reproducibles.