Erro 401 com NuGet e Team Foundation Server

Ao trabalhar com o NuGet em um projeto controlado pelo Team Foundation Server (TFS), poderão ocorrer ocasionalmente erros HTTP 401 (TF30063: You are not authorized to access Collection). Isso ocorre por algum problema do Visual Studio para armazenar as credenciais de acesso ao TFS, quando está trabalhando com a extensão do NuGet.

Para resolver isso, basta acessar o endereço do “Team Web Access” do seu Team Foundation pelo Internet Explorer e, ao entrar com as credenciais, marcar que deseja o navegador as armazene. Isso ocorre porque provavelmente o cliente web do Visual Studio utiliza o engine do Internet Explorer, então estes compartilham algumas preferências e configurações. Se mesmo assim o IE não esteja guardando as credenciais, pode ser necessário diminuir o nível de segurança do navegador em sites da intranet, além de adicionar o endereço base do TFS na lista de sites confiáveis.

Alterando a pasta de pacotes default do NuGet

Por default, o NuGet cria uma pasta “packages” na raiz da solução para colocar os pacotes baixados da internet. Se quiser que os pacotes sejam criados em uma pasta específica o procedimento é o seguinte:

1. Criar um arquivo nuget.config no nível da solução ou algum nível acima
Suponhamos que temos uma aplicação chamada MinhaAplicacao e dentro dela, tenho uma outra solução chamada WebAdmin, e que as pastas estão estruturadas da seguinte forma:

$\MinhaAplicacao\Main\Source\WebAdmin\MinhaAplicacao.WebAdmin.sln

Esta solução utiliza pacotes do NuGet, baixados ao criar o projeto do MVC 3. Existe uma pasta packages no mesmo nível da solution.

$\MinhaAplicacao\Main\Source\WebAdmin\packages

Para mudar isso, criarmos o arquivo no caminho:

$\MinhaAplicacao\Main\Source\nuget.config

Desta forma, ele  servirá para todas as solutions que estarão abaixo da pasta Source.

2. Especificar no arquivo nuget.config o caminho das referências.

Os assemblies do nosso projeto devem ficar na pasta SharedBinaries, dentro da pasta Main. Então, o nosso arquivo ficou assim:

<?xml version="1.0"?>
<settings>
  <repositoryPath>..\SharedBinaries\</repositoryPath>
</settings>

Com isso, estamos falando para o NuGet baixar os pacotes para $\MinhaAplicacao\Main\SharedBinaries\

3. Mover os pacotes existentes e alterar o arquivo repositories.config

Movemos todos arquivos dentro da pasta packages que havia dentro da nossa solution para SharedBinaries (não movemos a pasta packages). O arquivo repositories.config ficou assim:

<?xml version="1.0" encoding="utf-8"?>
<repositories>
  <repository path="..\Source\WebAdmin\Takenet.ChargingGateway.WebAdmin\packages.config" />
</repositories>

Resumindo tudo, nossa estrutura ficou assim:

$\MinhaAplicacao\Main\SharedBinaries\repositories.config
 $\MinhaAplicacao\Main\SharedBinaries\EntityFramework.4.1.10331.0\
 $\MinhaAplicacao\Main\SharedBinaries\jQuery.1.5.1\
 $\MinhaAplicacao\Main\SharedBinaries\jQuery.UI.Combined.1.8.11\
 $\MinhaAplicacao\Main\SharedBinaries\jQuery.Validation.1.8.0\
 $\MinhaAplicacao\Main\SharedBinaries\jQuery.vsdoc.1.5.1\
 $\MinhaAplicacao\Main\Source\nuget.config
 $\MinhaAplicacao\Main\Source\WebAdmin\packages.config

Obs: NuGet versão 1.4.20701.9038