1. Construyo desde VS2017 y los paquetes se descargan y los proyectos se compilan.
  2. Luego saqué la carpeta de paquetes.
  3. 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.

5
Binary Worrier 22 ene. 2018 a las 20:02

3 respuestas

La mejor respuesta

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í:

  1. 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 directorio obj\ que se verifican durante la evaluación.

  2. 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 objetivo Restore, 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 de msbuild.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
11
Martin Ullrich 22 ene. 2018 a las 23:34

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.

4
Binary Worrier 23 ene. 2018 a las 10:40

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.

0
SwDevMan81 22 ene. 2018 a las 18:42
48386725