Migrar desde CPM
Convierte una solución existente (con o sin CPM) en un workspace de PCPM en un solo comando.
Si ya tienes una solución .NET con o sin Central Package Management,
pcpm convert la migra in situ.
Qué hace
pcpm convert recorre tu workspace, mira cada <PackageReference />
en cada .csproj, y:
- Adopta tu
Directory.Packages.propsexistente, si lo tienes, y reescribe cada<PackageReference Include="X" Version="1.2.3" />a<PackageReference Include="X" />(sin versión, pues la versión ahora vive en CPM). - Crea
Directory.Packages.propssi no lo tienes, y sube cada versión por proyecto a una entrada<PackageVersion />. - Escribe
pcpm.jsony, en modo monorepo,pcpm-workspace.yaml. - Ejecuta
pcpm installpara materializar el store y producir elpcpm.lockinicial.
El comando completo es un no-op si el workspace ya tiene la forma que PCPM espera.
Cómo se ejecuta
pcpm convert
En un monorepo:
pcpm convert --workspace
El flag --workspace le dice a PCPM que escriba un
pcpm-workspace.yaml que cubra todos los proyectos descubiertos. Sin
él, PCPM solo mira el .sln en el directorio actual (o un nivel
arriba).
Qué NO hace
pcpm convert es conservador por diseño. No hace lo siguiente:
- Toca tus
.csprojmás allá del strip de versión descrito arriba. La estructura del proyecto, los SDK y las propiedades se quedan como están. - Cambia la configuración de tus feeds NuGet. Los
NuGet.configexistentes se conservan tal cual; PCPM los lee y escribe los mismos feeds enpcpm.jsonpara su propio uso. - Actualiza paquetes.
pcpm convertsolo normaliza tus versiones existentes a CPM. Para subir versiones, ejecutapcpm update <pkg>después del convert.
Ejemplo
Estado inicial:
<!-- src/Api/Api.csproj -->
<ItemGroup>
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
Tras pcpm convert:
<!-- Directory.Packages.props (creado) -->
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Serilog" Version="3.1.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
</ItemGroup>
</Project>
<!-- src/Api/Api.csproj (modificado) -->
<ItemGroup>
<PackageReference Include="Serilog" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>
Y los nuevos ficheros:
pcpm.jsonpcpm.lock(traspcpm install)
Rollback
pcpm convert no es destructivo — solo edita ficheros bajo la raíz
del workspace, y esas ediciones son amigables al diff. Para revertir:
git restore .
Eso revierte cada fichero que PCPM tocó, incluidos los manifiestos
nuevos. pcpm.lock y pcpm.json desaparecerán del diff.
Consejos para una conversión suave
- Hazlo en una rama. Siempre. El diff es pequeño pero las implicaciones para el resto del equipo no lo son.
- Ejecuta
dotnet builddespués del convert. Si algo está mal, aparecerá como un<PackageVersion />faltante o un proyecto que no fue recogido por el descubrimiento. - No combines el convert con bumps de versión. Primero consigue
la forma correcta, luego
pcpm updatedeliberadamente.