- Construyo desde VS2017 y los paquetes se descargan y los proyectos se compilan.
- Luego saqué la carpeta de paquetes.
- Luego construyo usando MSBuild, los proyectos fallan porque los paquetes no existen, no se han restaurado.
Tengo "descargar paquetes faltantes" en
Los archivos del proyecto se habrían creado originalmente en VS 2013
El build.proj utiliza la tarea MSBuild para construir la solución.
<MSBuild Projects ="$(root)\src\MySolution.sln" ContinueOnError ="false" Properties="Configuration=$(Configuration)">
<Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/>
</MSBuild>
Mi google-fu me ha fallado, todas y cada una de las ideas serán muy bien recibidas.
3 respuestas
Los proyectos basados en packages.config
deben restaurarse mediante NuGet, no MSBuild. Visual Studio hace esto cuando solicita una compilación a través de VS. Si necesita hacerlo desde la línea de comandos, debe usar la utilidad de línea de comandos nuget.exe
para restaurar los paquetes.
Solo la forma PackageReference
de hacer referencia a paquetes NuGet está integrada en MSBuild. Puede cambiar a este formato desinstalando todos los paquetes NuGet del proyecto y cambiando el formato predeterminado de administración de paquetes o seleccione la casilla de verificación "Permitir selección de formato en la primera instalación del paquete". Luego puede volver a agregar los paquetes (solo se necesitan paquetes de nivel superior) y asegurarse de que no genere un archivo packages.config
.
Hay algunos problemas aquí:
Después de una restauración, MSBuild tiene que volver a evaluar el archivo del proyecto. Cuando se utiliza la tarea
<MSBuild>
dentro de un script de CI, esto solo sucede cuando se pasa un conjunto diferente de propiedades a la tarea. Esto se debe a que Restaurar genera archivos importados automáticamente en el directorioobj\
que se verifican durante la evaluación.Si la restauración no se genera, pero altera estos archivos, esto no es suficiente y el proyecto debe ser reevaluado con cachés xml limpias. Esto no es posible con la tarea
<MSBuild>
. MSBuild 15.5 presenta una opción/restore
para ejecutar un objetivoRestore
, luego limpia estos cachés (para los cuales no había API antes) y ejecuta el resto de la compilación según lo solicitado. Antes de 15.5, se necesitaban dos invocaciones separadas demsbuild.exe
para asegurar que las restauraciones incrementales + compilaciones produzcan la salida correcta.
Si desea utilizar un proyecto de compilación de CI con PackageReference
, la forma más segura es crear un build.proj
que tenga una restauración y un objetivo de compilación:
<Project>
<Target Name="Restore">
<MSBuild Projects="$(root)\src\MySolution.sln" Targets="Restore" />
</Target>
<Target Name="Build">
<MSBuild Projects="$(root)\src\MySolution.sln" Targets="Build" />
</Target>
</Project>
Y ejecutarlo usando
msbuild /restore /t:Build build.proj
Descubrí que llamar a nuget restore MySolution.sln
restaurará los paquetes para una solución.
Pongo nuget.exe
en mi carpeta de compilación y ejecuto la restauración para cada solución en mi árbol de origen.
Mi objetivo MsBuild es restaurar paquetes para todos los proyectos en todas las soluciones.
<Target Name="NuGetRestore">
<ItemGroup>
<slns Include="$(MSBuildProjectDirectory)\..\**\*.sln"/>
</ItemGroup>
<Exec Command="$(MSBuildProjectDirectory)\nuget restore %(slns.Identity)"/>
</Target>
Nuget.exe
no tiene que estar en cada carpeta de proyecto, solo en la carpeta con build.
También me encontré con el problema de que MSBuild no extraía los paquetes. Agregué el archivo de ruta nuget.config
usando RestoreConfigFile
al parámetro de propiedades
RestoreConfigFile=$(MSBuildStartupDirectory)\.nuget\nuget.config
Y también cambió el valor de los objetivos en la tarea MSBuild:
MSBuild Targets="Restore;Clean;Build" Projects=...
El Restore
objetivo en realidad forzó la extracción de los paquetes y RestoreConfigFile
lo apuntó a mi configuración.
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
msbuild
Microsoft Build Engine, también conocido como MSBuild, es una plataforma de compilación para código administrado y fue parte de .NET Framework.