4

J'ai plusieurs solutions différentes, dans lesquelles certains projets peuvent dépendre de la sortie de projets dans d'autres solutions. Pour gérer cela, j'ai copié des fichiers dll à partir du dossier/bin/dans chaque projet vers un emplacement de bibliothèque partagé après la construction, puis copiez/référencez-les à partir de là vers le projet dépendant. Cependant, à mesure que la solution de bibliothèque devient plus grande, elle a tendance à devenir impossible à maintenir. Je passe trop de temps à parcourir les répertoires de solutions de l'explorateur Windows à la recherche de dossiers/bin /, et à essayer de déterminer lequel ou lesquels des fichiers dll de chacun de ceux dont j'ai besoin.Placez toutes les DLL de sortie dans le répertoire commun à partir de Visual Studio

Est-il possible de donner à Visual Studio un indice que je veux tous les projets dans une solution pour avoir le même répertoire de sortie? Par exemple, un dossier/bin/directement sous le dossier de solution, où tous les projets mettent leur sortie. Si possible, je souhaite réaliser cela sans les événements de post-construction codés en dur qui copient les fichiers, car cela échouera si une sortie de projet change le nom du fichier ou ajoute un autre fichier. Je préfère changer l'emplacement du répertoire de sortie réel - l'emplacement de $ (OutDir), si vous voulez.

Répondre

3

Vous pouvez définir le répertoire de sortie dans chaque propriété du projet.

Faites un clic droit sur le projet, sélectionnez Properties

Pour C#, il est l'un de la page de propriété Build, sous Output, Output directory.

Dans les projets VB.Net, il se trouve sur l'onglet Compile, dans la zone de texte en haut.

+0

Mes projets sont pour la plupart des projets VB.NET, donc les pages de propriétés ne sont pas identiques aux projets C#. –

+1

Trouvé quand même =) Cependant, c'est au niveau du projet. Que se passera-t-il si deux projets ont des dépendances sur le même troisième projet ou tiers dll - vont-ils écraser, renommer ou crier à l'aide (c'est-à-dire jeter des exceptions)? Ce que je veux dire, c'est: y a-t-il un moyen de le faire au niveau de la solution plutôt qu'au niveau du projet? –

+1

@Thomas - oui, au niveau du projet. Les exceptions ne seront pas lancées et généralement les DLL qui sont des dépendances seront écrasées. Ce n'est pas un problème car la compilation des projets est séquentielle. – Oded

7

Je sais que vous avez dit que vous ne voulez pas utiliser les événements post-construction, mais votre raison de ne pas m'intriguer. Il semble que vous puissiez coder en dur le nom du fichier .dll dans votre événement de création de publication. Cela peut facilement être évité.

xcopy "$(TargetDir)*" "c:\common\" /Y

Le * déclenchait tout dans votre bin/Debug/dossier sont copiés dans votre dossier commun. Vous pouvez également copier des DLL si vous le souhaitez. Ou, si vous utilisez $(TargetPath), vous copiez seulement la DLL 1 qui est le résultat du projet, et pas d'autres dépendances connexes.

MISE À JOUR

La façon dont nous le faisons est chaque projet tout le dossier bin est copié dans un dossier sous. Supposons que vous avez 2 projets, WebUtil et HtmlParser, où WebUtil dépend de HtmlParser. Pour les deux projets, utilisez xcopy "$(TargetDir)*" "c:\common\$(ProjectName)" /Y. Cela créera c: \ common \ WebUtil \ et c: \ common \ HtmlParser. Dans WebUtil, ajoutez une référence à c: \ common \ HtmlParser \ HtmlParser.dll. Il y aura maintenant 2 copies de HtmlParser.dll dans c: \ common.

c: \ common \ HtmlParser \ HtmlParser.dll // la version la plus récente. c: \ common \ WebUtil \ HTMLParser // ce était la plus récente construction quand WebUtil a été construit

Cela a toutes sortes d'avantages.Si vous changez l'API de HtmlParser, WebUtil continuera à fonctionner, car il aura le plus ancien HtmlParser.dll jusqu'à ce que vous essayiez de reconstruire WebUtil (à quel point vous obtiendrez des erreurs de construction en raison de l'API modifiée).

Maintenant, si un 3ème projet a dans le mélange qui dépendait de WebUtil, et que vous utilisez une partie de WebUtil qui expose des classes dans HTMLParser, alors vous aurez besoin d'ajouter une référence à la fois projets de votre nouveau projet. Lorsque vous ajoutez une référence à HtmlParser.dll, utilisez celui dans c: \ common \ WebUtil. Vous faites cela parce que vous l'incluez seulement comme une exigence nécessaire de WebUtil. Maintenant, vous aurez toujours la version de HtmlParser.dll qui correspond à votre version actuelle de WebUtil.dll.

J'espère que cela a du sens. Il peut certainement être une chose délicate à gérer. Attendez que vous deviez commencer à extraire toutes vos dépendances en utilisant svn: externals = P

+0

Cela me laisse toujours l'un des deux problèmes: Soit (si je copie tout de bin) je risque de copier trop et d'écraser des choses d'autres projets, ou (si je copie seulement la DLL qui est le résultat du projet) je risque se terminant avec trop peu dans le dossier builds, car les dépendances nécessaires peuvent être omises. N'y a-t-il pas de moyen terme? –

+1

+1 c'est exactement ce que j'aurais suggéré. @Tomas, réalisez-vous que vous pouvez filtrer encore plus la copie: 'xcopy" $ (TargetDir) *. Dll "" c: \ common \ "/ Y' pour copier uniquement les dll. Si cela ne vous convient pas, vous pouvez également ajouter une commande de copie plus spécifique. Ce n'est vraiment pas un problème, c'est seulement quelques minutes de travail et une ou deux versions de test, et si vous appliquez le bon filtrage à 'xcopy', alors il est aussi peu de maintenance. – slugster

+0

@Tomas - vous pouvez utiliser [Robocopy] (http://ss64.com/nt/robocopy.html) à la place et utiliser des options d'exclusion/d'inclusion pour contourner ces scénarios. –