8

Je suis en train de migrer tous mes projets C# à nouveau Nuget automatique Restauration, suivant ce tutoriel: Migrating MSBuild-Integrated solutions to use Automatic Package RestoreNuget automatique de restauration pour WebSite

Je l'ai fait avec succès à mes projets de bureau/bibliothèques, que je devais modifier les fichiers .csproj, la suppression de ces lignes de (je ne suis pas en utilisant TFS):

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

Cependant, ne semblent pas SitesWeb avoir une .csproj ou tout autre fichier contenant ces instructions. Quand j'installe un paquet, il place avec succès le .dll dans mon dossier de paquets, mais il le met également dans le dossier bin. Si je sélectionne le fichier .dll sous/bin au sein de l'Explorateur de solutions, il a les propriétés suivantes:

Auto-refresh path: C:\mypackages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll 
File Name: Newtonsoft.Json.dll 
Full Path: C:\MyWebSite\Bin\Newtonsoft.Json.dll 

ce paramètre est réglé par défaut quand j'installe un paquet de NuGet. Je pense qu'il ne devrait pas regarder dans le dossier de bin, ou quand je construis le projet, il devrait apporter le dossier .dll au bin s'il n'existe pas. Le problème est que si je construis le projet sans le .dll dans bin, il me donne l'erreur suivante: "Le nom de type ou d'espace de noms 'Newtonsoft' est introuvable (manque-t-il une directive using ou une référence d'assembly?)". Pour les projets de bureau/bibliothèques, le fichier .dll est copié dans le dossier bin. J'ai lu dans une autre question Nuget ne supporte pas WebSite, mais les applications Web à la place: NuGet Package restore for website, mais j'ai aussi lu dans la page de Nuget qu'ils ont ajouté la compatibilité aux sites Web ASP.NET, alors voici ma question: Suis-je faire quelque chose de mal? Ou devrais-je migrer vers une application Web, car elle ne prend pas en charge les sites Web?

+0

Le WAP est certainement la voie à suivre. Les sites Web sont beaucoup plus limités et n'ont pas beaucoup d'avantages si vous utilisez VS. Notez qu'avec la sortie de ASP.NET 5, il combinera le meilleur des deux mondes. J'ai bien utilisé NuGet avec des sites Web dans le passé. – mason

Répondre

2

Lorsque vous cliquez sur le bouton droit de la souris menu contextuel « Activer NuGet Package Restore » à la solution dans Visual Studio vous obtenez un message d'information montré qui dit:

Packages installed into Website projects will not be restored during build. Consider converting those into Web application projects necessary.

Cependant, il existe une solution j'ai essayé travaux. Considérez la situation lorsque vous avez un projet de bibliothèque de classes (DLL) référencé par le projet Site Web. Si les deux projets référencent le même package NuGet, alors la construction de la solution entière, le projet DLL est construit en premier, les paquets sont restaurés correctement. Prochaine étape en ce qui concerne le projet de site Web le package requis est déjà en place et ses DLL sont copiés dans le dossier /Website/Bin/ en fonction du fichier *.refresh. Résultat - la construction de la solution se termine avec succès.

2

Je peux certainement confirmer que la fonction de restauration automatique NuGet effectivement fonctionne pour les projets de sites Web sous VS avec la dernière version de NuGet.

Assurez-vous que:

  1. Vous utilisez NuGet 2.7 ou supérieur (Outils> Extensions et mises à jour> Mises à jour)
  2. Il n'y a pas de fichier .nuget \ NuGet.targets de à la solution racine
  3. Vous avez packages.config dans la racine du site Web avec toutes les références aux packages (normalement générés par VS lors de l'ajout des paquets NuGet)
  4. Visual Studio est configuré de manière à « Laisser NuGet pour télécharger les paquets manquants » et "vérifier automatiquement les manquants paquets lors de la construction "dans Visual studio (voir options> NuGet package Manager) - ceux-ci sont activés par défaut

Voici ce que je vois que la sortie de génération quand un package pour site Web projet est manquant.

Restoring NuGet packages... 
To prevent NuGet from restoring packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages during build.' 
------ Build started: Project: WebSite1, Configuration: Debug Any CPU ------ 
Validating Web Site 
Building directory '/'. 

Validation Complete 
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ========== 

Lien qui décrit ce qui précède en détails: https://docs.nuget.org/consume/package-restore. J'ai également le même problème décrit dans la question ci-dessus

+0

Je vois le paquet en cours de restauration, mais les scripts ne semblent pas être rajoutés au répertoire du site Web. Les voyez-vous être rajoutés? – GotDibbs

+0

@GodDibbs, quels scripts voulez-vous dire? –

+0

Désolé, je viens de réaliser que je n'étais pas assez générique :). Par exemple, si vous installez le [paquet de nuget de réaction] (https://www.nuget.org/packages/react.js/) dans un projet de site Web, supprimez les fichiers et le dossier de packages, puis tentez de restaurer, le dossier des paquets est repeuplé, mais pas le dossier des scripts sur le site Web. – GotDibbs

2

Je me demandais si vous aviez compris comment faire une restauration de nuget sur le site Web sans le fichier de projet. J'ai un package.config sur le site.

J'ai essayé un tas de choses différentes et la commande suivante m'a rapproché d'une résolution, mais pas tout à fait.

NuGet packages.config -PackagesDirectory .. restauration \ packages

La commande ci-dessus ne restaure les paquets dans le dossier .. \ packages comme prévu, mais je ne peux pas comprendre comment obtenir les assemblées correctes dans le dossier bin du site Web.

1

Voici la solution à ce problème et cela fonctionne.

Si vous disposez d'une couche de logique métier distincte, vous pouvez installer les packages nuget dans ce projet. Ensuite, vous pouvez faire la restauration de nuget sur la couche de logique métier avant de faire msbuild sur la solution de site Web. Lorsque vous faites msbuild sur la solution qui contient la BLL et le WebSite, tous les assemblages référencés (, y compris les dlls restaurées par nuget) seront extraits du projet BLL dans le dossier bin du site Web.

Voici une option de piratage si vous n'avez pas de couche logique métier distincte. Using NuGet with *.dll.refresh files in ASP.NET "Web Site" projects with Web Deployment Projects