Este proyecto hace referencia a los paquetes NuGet que faltan en esta computadora


313

Tengo una aplicación ASP.NET MVC5 que funcionó ayer y ahora recibo este error cuando intento compilar:

Este proyecto hace referencia a los paquetes NuGet que faltan en esta computadora.

Tengo las dos opciones marcadas que permiten que Nuget descargue e instale automáticamente los paquetes faltantes marcados / encendidos. También intenté eliminar todos los archivos en la carpeta de paquetes y luego nuget los volvió a descargar. Además, cuando abro Nuget y busco actualizaciones, dice que no hay ninguna que deba instalarse. No puedo imaginar qué más hacer para ir más allá de este problema increíblemente molesto.


1
También he habilitado la restauración de nuget haciendo clic derecho en el proyecto y seleccionando esa opción. Luego agregó una carpeta nuget y tres elementos en esa carpeta y no hace nada para resolver el problema. Intenté reconstruir y todavía recibo el mismo error anterior.
Austin Harris

¿Su solución incluye una carpeta .nuget y ha actualizado NuGet a la última versión? Ver aquí: stackoverflow.com/questions/18833649/…
David Brabant

Sí, lo intenté y no resolvió mi problema de mensaje de error de compilación.
Austin Harris

Otra razón para este error es un The operation has timed out.error. durante la construcción Debe verificar su registro de compilación o la pestaña Diagnóstico en la pantalla de información Error de compilación en línea de Visual Studio.
Joshua Drake

Ninguna de las soluciones funciona para mí. Estoy descargando desde un repositorio y los paquetes se restauran en la estructura de archivos correcta para el primer proyecto, el segundo proyecto no puede encontrarlos. Comprobar el .csproj muestra que se está utilizando la ruta relativa correcta, por lo que no sé si intento resolver esto. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Respuestas:


463

En mi caso, tuve que eliminar lo siguiente del archivo .csproj:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

De hecho, en este fragmento puede ver de dónde proviene el mensaje de error.

Estaba convirtiendo de MSBuild-Integrated Package Restore a Automatic Package Restore ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )


12
Esto funcionó para mí, pero solo necesitaba eliminar el elemento <Target> </Target>. VS [2013] parecía restaurarlo si también eliminaba el elemento <Import>.
Robert Taylor

3
Esto es realmente increíble. ¿Por qué Microsoft hace que todo sea tan difícil?
dimiguel

11
si esto se puede eliminar, ¿por qué está allí en primer lugar?
OK999

1
OK9999, en un momento, debe haberlo habilitado desde una versión anterior de Visual Studio, haciendo clic derecho en la solución y seleccionando "Habilitar la restauración del paquete NuGet" que lo hizo a la antigua usanza. Ya no necesitamos eso
Loren Paulsen

3
Me encantan las soluciones que solo implican eliminar cosas.
Todd Menier

86

Una solución sería eliminar del archivo .csproj lo siguiente:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

¿Cómo?

  1. Haga clic derecho en el proyecto. Descargar proyecto.
  2. Haga clic derecho en el proyecto. Editar csproj.
  3. Eliminar la parte del archivo. Salvar.
  4. Haga clic derecho en el proyecto. Proyecto de recarga.

Cuando mueve un proyecto de un lugar a otro, esto funciona muy bien.
Dean Seo

44
@IvanSantiago ¡ Ya fue RESPONDIDO arriba con la misma solución! .. ¡ Vota ABAJO! ..
Jack

2
@ClintEastwood Mi respuesta explicó CÓMO hacerlo. Esa es la diferencia. Si un usuario está buscando un CÓMO, mi respuesta la tiene, en contraste con la respuesta anterior.
Ivan Santiago

2
@IvanSantiago Podría haber: agregado como comentario o editado la respuesta original con el Cómo.
Colin

50

En mi caso, sucedió después de que moví mi carpeta de solución de una ubicación a otra, la reorganicé un poco y en el proceso su estructura de carpeta relativa cambió.

Así que tuve que editar todas las entradas similares a la siguiente en mi .csprojarchivo de

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

a

  <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

(Tenga en cuenta el cambio de ..\packages\a packages\. Puede ser una estructura relativa diferente en su caso, pero se entiende la idea).


3
Problema similar ... Había movido el archivo .csproj a un nivel superior en la estructura del directorio y tuve que cambiar de ".. \ .. \ packages \ ..." a ".. \ packages \ ...".
tmgirvin

2
Tuve un problema similar, pero realmente extraño. Lo estaba usando en un módulo de subsolución, por lo que estaba bien en esa solución, pero cuando hice referencia a esa solución desde otra solución, los paquetes estaban en un lugar diferente. Cambié ... \ packages a $ (SolutionDir) paquetes en todo el .csproj y eso lo solucionó.
JoeNCA

2
Si no quiere jugar con el archivo .csproj manualmente, descubrí que tomar nota de todos los paquetes nuget que instaló para el proyecto, eliminarlos y reinstalarlos resolvió el problema. Intenté eliminar un proyecto de una solución para ponerlo en su propio repositorio git cuando me encontré con este problema.
WiteCastle

¿Significa esto que su .csproj está al mismo nivel que su archivo .sln?
Simon_Weaver

@Simon_Weaver la posición de su .csprojpariente respecto a su .slnno importa en este contexto. Lo que importa es si algo a lo que se hace referencia en su se .csprojhabía mudado a otro lugar. Si es así, entonces debes arreglarlo. Si movió su '.csproj' con todo lo que hace referencia intacto, pero mantuvo su lugar .slndonde estaba, entonces tendría que arreglar el .slnarchivo a la nueva ubicación de .csproj-es, pero no habría necesidad de editar .csprojarchivos.
Nikita G.

22

Me fácilmente resolver este problema haciendo clic derecho sobre mi solución y luego hacer clic en el Habilitar NuGet paquete Restaurar opción

(PD: asegúrese de tener Nuget Install From Tools -> Extensions and Update -> Nuget Package Manager para Visual Studio 2013. Si no, instale esta extensión primero)

Espero eso ayude.


77
Esta es la antigua forma de restaurar paquetes nuget y debe evitarse.
The Muffin Man

2
@TheMuffinMan: ¿Puede aclarar cuál es la nueva forma y por qué debería evitarse esta manera (teniendo en cuenta que la salida de error VS 2013 le dice que haga exactamente eso)?
CantrianBear

2
@CantrianBear Navegue a esta página docs.nuget.org/consume/package-restore y encuentre la sección llamada MSBuild-Integrated Package Restore. Esa es la forma anterior y enumera algunas razones por las que debe usar la nueva forma.
The Muffin Man

Vea el blog de David Ebbo en este blog.davidebbo.com/2014/01/… Ahora ... "NuGet ahora siempre restaura los paquetes antes de construir en VS."
timB33

17

En mi caso tenía que ver con la versión Microsoft.Build.Bcl. La versión de mi paquete nuget era 1.0.21, pero mis archivos de proyecto todavía apuntaban a la versión 1.0.14

Así que cambié mis archivos .csproj de:

  <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
   <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

a:

 <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />

Y la construcción estaba funcionando de nuevo.


11

Si estás usando TFS

Elimine los archivos NuGet.exey NuGet.targetsde la .nugetcarpeta de la solución . Asegúrese de que los archivos mismos también se eliminen del espacio de trabajo de la solución. Conserve el NuGet.Configarchivo para continuar omitiendo la adición de paquetes al control de origen.

Edite cada archivo de proyecto (por ejemplo, .csproj, .vbproj) en la solución y elimine las referencias al NuGet.targetsarchivo. Abra los archivos del proyecto en el editor de su elección y elimine la siguiente configuración:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Si no estás usando TFS

Elimine la .nugetcarpeta de su solución. Asegúrese de que la carpeta en sí también se elimine del espacio de trabajo de la solución.

Edite cada archivo de proyecto (por ejemplo, .csproj, .vbproj) en la solución y elimine las referencias al NuGet.targetsarchivo. Abra los archivos del proyecto en el editor de su elección y elimine la siguiente configuración:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Referencia: Migración de soluciones integradas de MSBuild para usar la Restauración automática de paquetes


8

¿Es posible que los paquetes se hayan restaurado en la carpeta incorrecta? Compruebe que las rutas en los archivos csproj son correctas.

Si son diferentes, podría deberse a que los paquetes ahora se están restaurando en una ubicación diferente. Esto podría ser causado por un archivo NuGet.Config que se verifica al especificar un nodo como este:

<add key="repositoryPath" value="..\..\Packages" />

Los paquetes están siendo restaurados, por los proyectos todavía están buscando en la ubicación anterior.


1
Creo que podría ser un problema de ruta ya que moví la ubicación de los archivos, pero no veo dónde hay una ruta codificada en ningún lado. Miré en el archivo de proyecto y todos los archivos de paquetes parecen ser relativos de esta manera: <Reference Include = "Antlr3.Runtime, Version = 3.5.0.2, Culture = neutral, PublicKeyToken = eb42632606e9261f, processorArchitecture = MSIL"> <SpecificVersion> False </SpecificVersion> <HintPath> .. \ packages \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </HintPath> </Reference>
Austin Harris

agregar esto a web.config no ayudó: <add key = "repositoryPath" value = ".. \ .. \ Packages" />
Austin Harris

No desea agregar eso a web.config. Me refería al archivo NuGet.config y desea verificar la ruta relativa. ¿Dónde están sus paquetes en relación con los archivos csproj? ¿Están en .. \ paquetes? Parece que los paquetes se están restaurando correctamente, pero sus proyectos están buscando en el lugar equivocado.
infojolt

6

Tuve el mismo problema. En mi caso, la instalación del paquete Microsoft.Bcl.Build solucionó el problema.


Esto también funcionó para mí, pero no tengo idea de si lo correcto fue instalar ese paquete (que tiene el mismo efecto que la respuesta de cambio de versión de henkie14 a continuación o simplemente eliminar todos esos objetivos: ¿realmente están haciendo algo útil?
Gaz

En la 1.0.21versión sin archivos en el paquete, la instalación de la 1.0.14versión solucionó esto.
FLCL

4

Eliminado debajo de las líneas en el archivo .csproj

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" 
Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
 <ErrorText>This project references NuGet package(s) that are missing on this computer. 
 Enable NuGet Package Restore to download them.  For more information, see 
 http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" 
Text="$([System.String]::Format('$(ErrorText)', 
'$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

3

Una solución sería eliminar del archivo .csproj lo siguiente:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

Este proyecto hace referencia a los paquetes NuGet que faltan en esta computadora. Habilite NuGet Package Restore para descargarlos. Para obtener más información, consulte http://go.microsoft.com/fwlink/?LinkID=322105 . El archivo que falta es {0}.


1

Estos son los pasos que utilicé para solucionar el problema:

Para agregar paquetes nuget a su solución:

  1. Haga clic derecho en el proyecto (no en la solución) al que desea hacer referencia a los paquetes nuget.
  2. Elija: Administrar paquetes nuget
  3. En la ventana emergente, a la izquierda tiene tres opciones. Si elige En línea> Microsoft y .NET , podrá instalar el agrupador de paquetes Microsoft ASP.NET Web API 2.2 (o cualquier paquete que necesite, el mío fue este).
  4. Ahora haga clic derecho en su solución (no proyecto) y elija Habilitar restauración de paquete nuget . Esto hará que los paquetes se descarguen automáticamente en la compilación.

Todo lo que tenía que hacer era habilitar la restauración del paquete de nugget para la solución. Aparentemente, todo lo demás ya estaba configurado correctamente.
schmiddy98

1

Para mí funcionó ya que simplemente copié una carpeta .nuget de una solución que funciona a la existente, ¡y hice referencia a su contenido!


1

Lo primero que debe intentar es hacer clic con el botón derecho en la solución y seleccionar "Restaurar paquetes Nuget".

En mi caso, eso no funcionó, así que seguí algunas recomendaciones sobre la eliminación de "Importar" y "Destino" en el archivo del proyecto, esto funcionó para 2 de mis 3 proyectos, pero obtuve un error diferente en el último.

Lo que funcionó fue abrir la consola de Package Manager y ejecutar:

Update-Package -reinstall -ProjectName MyProjectName

Lleva algún tiempo, pero dado que reinstala todos los paquetes, su proyecto se compilará sin problemas


1

Tengo el mismo problema. Lo encontré cuando copié un proyecto existente y lo transfirí a la carpeta de mi directorio de soluciones y lo agregué como proyecto existente a mi solución vacía. Así que tengo que editar mi archivo csproj y buscar esta línea de código específica, la mayoría de las veces, esto se puede encontrar en las últimas líneas:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Después de esa línea, tengo que comentar esto:

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" />
  </Target>
  <Import Project="..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" />

Su solución le indicará que hubo un cambio en su proyecto, simplemente seleccione Volver a cargar todo:

ingrese la descripción de la imagen aquí Entonces todo funciona bien después de reconstruir mi solución.


0

Tuve el mismo problema cuando hago referencia a la biblioteca de clases en mi aplicación web MVC,

el problema era la falta de coincidencia del número de versión del paquete nuget entre dos proyectos.

Ej: mi biblioteca de clases tenía log4net de 1.2.3 pero mi aplicación web tenía 1.2.6

solución: solo asegúrese de que ambos proyectos tengan el mismo número de versión al que se hace referencia.


0

Editar .sln y .csproj no siempre es tan fácil o deseable. Una vez que obtiene la lista de errores, puede ver qué proyectos tienen paquetes faltantes (también, el nodo Referencias generalmente indica que faltan ensamblajes a menos que los paquetes sean código fuente, recursos, imágenes o simplemente basados ​​en texto).

Eliminar y luego agregar los paquetes no es una buena idea a menos que use la última versión del paquete. De lo contrario, prepárate para sorpresas, no siempre agradables.

Si, por ejemplo, el paquete es EntityFramework, entonces de la galería NuGet obtienes la última versión que al momento de escribir este comentario es 6.1.3 .

Entonces, quizás la forma más segura de manejar la situación es restaurar los paquetes faltantes uno por uno. Sí, un ejercicio un poco doloroso, pero perseguir errores sutiles debido a la diferente versión del paquete puede ser mucho más desagradable.

Dicho esto, y dejando que EntityFramework sea el paquete que falta, puede emitir el siguiente comando en la Consola del Administrador de paquetes:

PM> Install-Package EntityFramework -Version 6.0.1 

Esto instalará la versión correcta, que es 6.0.1 , que es la que se especifica en los paquetes.config:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.0.1" targetFramework="net451" />
    </packages>

0

Tuve esto cuando los archivos csproj y sln estaban en la misma carpeta (estúpido, lo sé). Una vez que me mudé al archivo sln a la carpeta encima de la carpeta csproj, mi


-1

Creé una carpeta llamada '.nuget' en la carpeta raíz de la solución. Luego agregué el archivo 'NuGet.Config' en esta carpeta con el siguiente contenido

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
 <add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>

Luego creó el archivo '.nuGet.targets' como se muestra a continuación $ (MSBuildProjectDirectory) .. \

    <!-- Enable the restore command to run before builds -->
    <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>

    <!-- Property that enables building a package from a project -->
    <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>

    <!-- Determines if package restore consent is required to restore packages -->
    <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

    <!-- Download NuGet.exe if it does not already exist -->
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
    <!--
        <PackageSource Include="https://nuget.org/api/v2/" />
        <PackageSource Include="https://my-nuget-source/nuget/" />
    -->
</ItemGroup>

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <!-- Windows specific commands -->
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
    <PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>

<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
    <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
    <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
    <PackagesConfig>packages.config</PackagesConfig>
    <PackagesDir>$(SolutionDir)packages</PackagesDir>
</PropertyGroup>

<PropertyGroup>
    <!-- NuGet command -->
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
    <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>

    <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
    <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>

    <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>

    <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
    <!-- Commands -->
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch) -o "$(PackagesDir)"</RestoreCommand>
    <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols</BuildCommand>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(RestorePackages) == 'true'">
        RestorePackages;
        $(BuildDependsOn);
    </BuildDependsOn>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(BuildPackage) == 'true'">
        $(BuildDependsOn);
        BuildPackage;
    </BuildDependsOn>
</PropertyGroup>

<Target Name="CheckPrerequisites">
    <!-- Raise an error if we're unable to locate nuget.exe  -->
    <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
    <SetEnvironmentVariable EnvKey="VisualStudioVersion" EnvValue="$(VisualStudioVersion)" Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' " />
    <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')"  />
</Target>

<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(RestoreCommand)"
          Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

    <Exec Command="$(RestoreCommand)"
          LogStandardErrorAsError="true"
          Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>

<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(BuildCommand)" 
          Condition=" '$(OS)' != 'Windows_NT' " />

    <Exec Command="$(BuildCommand)"
          LogStandardErrorAsError="true"
          Condition=" '$(OS)' == 'Windows_NT' " />
</Target>

<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <OutputFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Core" />
        <Using Namespace="System" />
        <Using Namespace="System.IO" />
        <Using Namespace="System.Net" />
        <Using Namespace="Microsoft.Build.Framework" />
        <Using Namespace="Microsoft.Build.Utilities" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                OutputFilename = Path.GetFullPath(OutputFilename);

                Log.LogMessage("Downloading latest version of NuGet.exe...");
                WebClient webClient = new WebClient();
                webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

                return true;
            }
            catch (Exception ex) {
                Log.LogErrorFromException(ex);
                return false;
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

 <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <EnvKey ParameterType="System.String" Required="true" />
        <EnvValue ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process);
            }
            catch  {
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.