Este projeto faz referência aos pacotes NuGet que estão faltando neste computador

313

Eu tenho um aplicativo ASP.NET MVC5 que funcionou ontem e agora estou recebendo esse erro ao tentar criar:

Este projeto faz referência aos pacotes NuGet que estão faltando neste computador.

Eu tenho as duas opções marcadas que permitem que o nuget baixe e instale automaticamente os pacotes ausentes marcados / ativados. Eu também tentei excluir todos os arquivos na pasta packages e depois o nuget os baixou novamente. Além disso, quando abro o nuget e procuro atualizações, ele diz que não há nenhum que precise ser instalado. Não consigo imaginar o que mais fazer para ir além dessa questão incrivelmente irritante.

Austin Harris
fonte
1
Também habilitei a restauração de nuget clicando com o botão direito do mouse no projeto e selecionando essa opção. Em seguida, adicionou uma pasta nuget e três itens nessa pasta e não faz nada para resolver o problema. Tentei reconstruir e ainda recebo o mesmo erro acima.
Austin Harris
Sua solução inclui uma pasta .nuget e você atualizou o NuGet para a versão mais recente? Veja aqui: stackoverflow.com/questions/18833649/…
David Brabant
Sim, tentei isso e não resolveu meu problema de mensagem de erro de compilação.
Austin Harris
Outro motivo para esse erro é um The operation has timed out.erro. durante a compilação. Você precisa verificar o log de compilação ou a guia Diagnóstico na tela de informações Falha na compilação do Visual Studio Online.
21915 Joshua Drake
Nenhuma das soluções funciona para mim. Estou baixando de um repositório e os pacotes são restaurados na estrutura de arquivos correta para o primeiro projeto, o segundo projeto não pode encontrá-los. A verificação do arquivo .csproj mostra que o caminho relativo correto está sendo usado, por isso não consigo tentar resolver isso. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Respostas:

463

No meu caso, tive que remover o seguinte do arquivo .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 fato, neste trecho você pode ver de onde vem a mensagem de erro.

Eu estava convertendo do MSBuild-Integrated Package Restore para o Automatic Package Restore ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )

Loren Paulsen
fonte
12
Isso funcionou para mim, mas eu só precisava remover o elemento <Target> </Target>. O VS [2013] pareceu restaurá-lo se eu também removesse o elemento <Import>.
Robert Taylor
3
Isso é seriamente inacreditável. Por que a Microsoft torna tudo tão difícil?
dimiguel
11
se isso pode ser removido, por que está lá em primeiro lugar?
OK999 17/08/19
1
OK9999, em um ponto, você deve habilitá-lo a partir de uma versão anterior do Visual Studio, clicando com o botão direito do mouse na solução e escolhendo "Ativar restauração do pacote NuGet", que fazia da maneira antiga. Não precisamos mais disso
Loren Paulsen
3
Eu amo soluções que envolvem apenas a exclusão de coisas.
Todd Menier
86

Uma solução seria remover do arquivo .csproj o seguinte:

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

Quão?

  1. Clique com o botão direito do mouse no projeto. Descarregar projeto.
  2. Clique com o botão direito do mouse no projeto. Edite csproj.
  3. Remova a parte do arquivo. Salve .
  4. Clique com o botão direito do mouse no projeto. Recarregar projeto.
Ivan Santiago
fonte
Quando você move um projeto de um lugar para outro, isso funciona muito bem.
Dean Seo
4
@IvanSantiago Ele já foi respondida acima com a mesma solução ..! Vote para baixo ..!
Jack
2
@ClintEastwood Minha resposta explicou COMO fazê-lo. Essa é a diferença. Se um usuário estiver procurando por um COMO, minha resposta é essa, em contraste com a resposta acima.
Ivan Santiago
2
@IvanSantiago Você poderia: adicionou-o como um comentário ou editou a resposta original com o Como Fazer.
Colin
50

No meu caso, aconteceu depois que mudei minha pasta de solução de um local para outro, reorganizei-a um pouco e, no processo, sua estrutura de pastas relativa foi alterada.

Então eu tive que editar todas as entradas semelhantes à seguinte no meu .csprojarquivo 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')" />

para

  <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')" />

(Observe a alteração de ..\packages\para packages\. Pode ser uma estrutura relativa diferente no seu caso, mas você entendeu.)

Nikita G.
fonte
3
Problema semelhante .... Eu havia movido o arquivo .csproj para um nível superior na estrutura de diretórios e tive que mudar de ".. \ .. \ packages \ ..." para ".. \ packages \ ...".
tmgirvin
2
Eu tive um problema semelhante, mas muito estranho. Eu estava usando-o em um módulo de subsolução, por isso estava bem nessa solução, mas quando referenciei a solução de outra solução, os pacotes estavam em um local diferente. Alterei .. \ packages para pacotes $ (SolutionDir) em todo o .csproj e isso foi corrigido.
21415 JoeNCA
2
Se você não quiser mexer com o arquivo .csproj manualmente, descobri que tomar nota de todos os pacotes de nuget que você instalou para o projeto, excluí-los e reinstalá-los resolveu esse problema para mim. Eu estava tentando remover um projeto de uma solução para colocar em seu próprio repositório git quando me deparei com esse problema.
WiteCastle 26/08/2015
isso significa que seu arquivo .csproj está no mesmo nível que o arquivo .sln?
Simon_Weaver
@ Simon_Weaver A posição do seu .csprojparente em relação ao seu .slnnão importa neste contexto. O que importa é se alguma coisa mencionada na sua .csprojfoi movida para outro lugar. Se assim for, então você precisa corrigi-lo. Se você moveu o '.csproj' com tudo o que ele faz referência intacto, mas manteve o local .slnonde estava, seria necessário corrigir o .slnarquivo no novo local de .csproj-es, mas não seria necessário editar os .csprojarquivos.
Nikita G.
22

Eu resolvo esse problema facilmente, clicando com o botão direito do mouse na minha solução e, em seguida, clicando na opção Habilitar restauração do pacote NuGet

(PS: Verifique se você possui o Nuget Install From Tools -> Extensions and Update -> Nuget Package Manager para Visual Studio 2013. Se não instalar esta extensão primeiro)

Espero que ajude.

MA
fonte
7
Essa é a maneira antiga de restaurar pacotes de nuget e deve ser evitada.
The Muffin Man
2
@TheMuffinMan: Você pode esclarecer qual é o novo caminho e por que esse caminho deve ser evitado (considerando que a saída de erro do VS 2013 diz para você fazer exatamente isso)?
precisa saber é o seguinte
2
@CantrianBear Navegue até esta página docs.nuget.org/consume/package-restore e localize a seção chamada MSBuild-Integrated Package Restore. Essa é a maneira antiga e lista algumas razões pelas quais você deve usar a nova maneira.
O homem de muffin
Consulte o blog de David Ebbo neste blog.davidebbo.com/2014/01/… Agora ... "Agora, o NuGet sempre restaura pacotes antes de criar no VS."
precisa saber é
17

No meu caso, tinha a ver com a versão Microsoft.Build.Bcl. Minha versão do pacote nuget era 1.0.21, mas meus arquivos de projeto ainda apontavam para a versão 1.0.14

Então mudei meus arquivos .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>

para:

 <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" />

E a construção estava funcionando novamente.

henkie14
fonte
11

Se você estiver usando o TFS

Remova os arquivos NuGet.exee NuGet.targetsda .nugetpasta da solução . Verifique se os arquivos também foram removidos do espaço de trabalho da solução. Mantenha o NuGet.Configarquivo para continuar ignorando a adição de pacotes ao controle de origem.

Edite cada arquivo de projeto (por exemplo, .csproj, .vbproj) na solução e remova todas as referências ao NuGet.targetsarquivo. Abra o (s) arquivo (s) do projeto no editor de sua escolha e remova as seguintes configurações:

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

Se você não estiver usando o TFS

Remova a .nugetpasta da sua solução. Verifique se a pasta em si também foi removida do espaço de trabalho da solução.

Edite cada arquivo de projeto (por exemplo, .csproj, .vbproj) na solução e remova todas as referências ao NuGet.targetsarquivo. Abra o (s) arquivo (s) do projeto no editor de sua escolha e remova as seguintes configurações:

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

Referência: Migrando soluções integradas ao MSBuild para usar a restauração automática de pacotes

RAM
fonte
8

É possível que os pacotes tenham sido restaurados para a pasta errada? Verifique se os caminhos nos arquivos csproj estão corretos.

Se eles forem diferentes, isso pode ser causado pelos pacotes agora sendo restaurados em um local diferente. Isso pode ser causado pelo check-in de um arquivo NuGet.Config, especificando um nó como este:

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

Os pacotes estão sendo restaurados, pelos projetos ainda estão olhando para o local antigo.

infojolt
fonte
1
Acredito que possa ser um problema de caminho, pois mudei o local dos arquivos, mas não vejo onde há um caminho codificado em nenhum lugar. Eu procurei no arquivo proj e todos os arquivos de pacotes parecem ser assim: <Referência Include = "Antlr3.Runtime, Versão = 3.5.0.2, Culture = neutral, PublicKeyToken = eb42632606e9261f, processingArchitecture = MSIL"> <SpecificVersion> False </SpecificVersion> <HintPath> .. \ packages \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </HintPath> </Reference>
Austin Harris
adicionar isso ao web.config não ajudou: <add key = "repositoryPath" value = ".. \ .. \ Packages" />
Austin Harris
Você não deseja adicionar isso ao web.config. Eu estava me referindo ao arquivo NuGet.config e você deseja verificar o caminho relativo. Onde estão seus pacotes em relação aos arquivos csproj? Eles estão em .. \ packages? Parece que os pacotes estão sendo restaurados corretamente, mas seus projetos estão procurando no lugar errado.
Infojolt
6

Eu tive o mesmo problema. No meu caso, a instalação do pacote Microsoft.Bcl.Build corrigiu o problema.

mheyman
fonte
Isso funcionou para mim também - mas não tenho idéia se a coisa certa a fazer foi instalar esse pacote (que tem o mesmo efeito da resposta de alteração de versão do henkie14 abaixo ou apenas excluir todos esses alvos - eles estão realmente fazendo algo útil?
Gaz
Na 1.0.21versão sem arquivos no pacote, a instalação da 1.0.14versão corrigiu isso.
FLCL
4

Removido abaixo das linhas no arquivo .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>
Amila Thennakoon
fonte
3

Uma solução seria remover do arquivo .csproj o seguinte:

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

Este projeto faz referência aos pacotes NuGet que estão faltando neste computador. Ative a Restauração do pacote NuGet para baixá-los. Para mais informações, consulte http://go.microsoft.com/fwlink/?LinkID=322105 . O arquivo ausente é {0}.

Umar Khaliq
fonte
1

Estas são as etapas que eu usei para corrigir o problema:

Para adicionar pacotes nuget à sua solução:

  1. Clique com o botão direito do mouse no projeto (não na solução) ao qual você deseja fazer referência aos pacotes de nuget.
  2. Escolha: Gerenciar pacotes de nuget
  3. Na janela pop-up, à esquerda, você tem três opções. Se você escolher Online> Microsoft & .NET , poderá instalar o agrupador de pacotes do Microsoft ASP.NET Web API 2.2 (ou qualquer pacote que você precise - o meu era este).
  4. Agora clique com o botão direito do mouse na sua solução (não no projeto) e escolha Habilitar restauração de pacote de nuget . Isso fará com que os pacotes sejam baixados automaticamente na compilação.
user4569838
fonte
Tudo o que eu precisava fazer era ativar a restauração do pacote nugget para a solução. Aparentemente, tudo o resto já estava configurado corretamente.
23415 schmiddy98
1

Para mim, funcionou porque acabei de copiar uma pasta .nuget de uma solução funcional para a existente e referenciei seu conteúdo!

meJustAndrew
fonte
1

A primeira coisa a tentar é clicar com o botão direito do mouse na solução e selecionar "Restaurar Pacotes de Nuget".

No meu caso, como não funcionou, segui algumas recomendações sobre a exclusão de "Importar" e "Destino" no arquivo do projeto, isso funcionou para dois dos meus três projetos, mas ocorreu um erro diferente no último.

O que funcionou foi abrir o Package Manager Console e executar:

Update-Package -reinstall -ProjectName MyProjectName

Demora algum tempo, mas como reinstalar todos os pacotes, seu projeto será compilado sem problemas

Juan C Calderon
fonte
1

Eu tenho o mesmo problema. Encontrei-o quando copiei um projeto existente e o transferi para a pasta do diretório da minha solução e o adicionei como projeto existente à minha solução vazia. Então, eu tenho que editar meu arquivo csproj e procurar essa linha de código específica, na maioria das vezes, isso pode ser encontrado nas últimas linhas:

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

Depois dessa linha, tenho que comentar isso:

  <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')" />

Sua solução solicitará que houve uma alteração no seu projeto, basta selecionar Recarregar tudo:

insira a descrição da imagem aqui Então, tudo funciona bem após a reconstrução da minha solução.

Willy David Jr
fonte
0

Eu tive o mesmo problema ao fazer referência à biblioteca de classes no meu aplicativo da Web MVC,

o problema era a incompatibilidade do número da versão do pacote nuget entre dois projetos.

ex: minha biblioteca de classes tinha o log4net da versão 1.2.3, mas meu aplicativo da web tinha a versão 1.2.6

correção: apenas verifique se o projeto tem o mesmo número de versão referenciado.

Srini
fonte
0

Editar .sln e .csproj nem sempre é fácil ou desejável. Depois de obter a lista de erros, você pode ver quais projetos têm pacotes ausentes (também, o nó References geralmente indica que há assemblies ausentes, a menos que os pacotes sejam código fonte, recursos, imagens ou apenas baseados em texto).

Remover e adicionar os pacotes não é uma boa ideia, a menos que você use a versão mais recente do pacote. Caso contrário, esteja preparado para surpresas, nem sempre agradáveis.

Se, por exemplo, o pacote for EntityFramework, na galeria do NuGet, você obtém a versão mais recente que, no momento da redação deste comentário, é 6.1.3 .

Portanto, talvez a maneira mais segura de lidar com a situação seja restaurar os pacotes ausentes, um por um. Sim, um exercício um pouco doloroso, mas perseguindo erros sutis devido à versão diferente do pacote, talvez muito mais desagradável.

Dito isto, e deixe novamente EntityFramework o pacote ausente, você pode emitir o seguinte comando no Console do Gerenciador de Pacotes:

PM> Install-Package EntityFramework -Version 6.0.1 

Isso instalará a versão correta, 6.0.0 , especificada em packages.config:

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

Eu tive isso quando os arquivos csproj e sln estavam na mesma pasta (estúpido, eu sei). Depois que mudei para o arquivo sln para a pasta acima da pasta csproj, meu

David Christopher Reynolds
fonte
-1

Criei uma pasta chamada '.nuget' na pasta raiz da solução. Em seguida, adicionei o arquivo 'NuGet.Config' nesta pasta com o seguinte conteúdo

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

Em seguida, criei o arquivo '.nuGet.targets' como abaixo de $ (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>

Sofia Khwaja
fonte