es

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:

  1. Adopta tu Directory.Packages.props existente, 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).
  2. Crea Directory.Packages.props si no lo tienes, y sube cada versión por proyecto a una entrada <PackageVersion />.
  3. Escribe pcpm.json y, en modo monorepo, pcpm-workspace.yaml.
  4. Ejecuta pcpm install para materializar el store y producir el pcpm.lock inicial.

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 .csproj má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.config existentes se conservan tal cual; PCPM los lee y escribe los mismos feeds en pcpm.json para su propio uso.
  • Actualiza paquetes. pcpm convert solo normaliza tus versiones existentes a CPM. Para subir versiones, ejecuta pcpm 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.json
  • pcpm.lock (tras pcpm 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 build despué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 update deliberadamente.