Réglage de la OutputPath propriété d'un projet via Visual Studio Automatisation
Je suis en train d'écrire un package VSIX pour permettre à l'utilisateur de modifier la masse de la OutputPath propriété de toutes les configurations de projets actuellement chargées de la solution (voir l'incroyablement ennuyeux étape #4 ici).
J'ai couru dans un problème très concret: lors de la définition de la propriété à une valeur contenant des macros (par exemple "$(SolutionDir)\bin\Debug"
la valeur écrite dans le .csproj est échappé comme suit:
<OutputPath>%24%28SolutionDir%29\bin\Debug\</OutputPath>
Qui, plutôt que de laisser MSBuild élargir la macro, crée un véritable dossier physique nommé $(SolutionDir)
. J'aimerais quelque sorte court-circuiter ce processus d'échappement.
La documentation MSDN est sans surprise manque dans ce domaine.
Mon code est comme suit:
private void MenuItemCallback(object sender, EventArgs e)
{
SolutionWideOutputDialogWindow dialog = new SolutionWideOutputDialogWindow();
dialog.ShowModal();
if (!dialog.DialogResult.HasValue || !dialog.DialogResult.Value)
{
return;
}
string requestedOutputPath = dialog.outputPathTextBox.Text;
Solution2 solution = _dte2.Solution as Solution2;
if (solution == null)
{
return;
}
Projects projects = solution.Projects;
foreach (Project project in projects)
{
Property outputPath = project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath");
outputPath.Value = requestedOutputPath;
project.Save();
}
}
Apprécie beaucoup l'aide de personne.
- La même chose arrive quand vous le faites avec l'IDE. Ni l'IDE de donner quelque indication que ce soit que les macros sont pris en charge. Donc, assez sûr de supposer que vous juste ne peut pas faire ce travail. Utilisez un chemin relatif au lieu de cela, comme
..\bin\debug
. - Eh bien, MSBuild ne prennent en charge, mais qui me laisse avec la modification du projet sous-jacent des fichiers directement
- Msbuild/VS façon de "faire x pour tous les projets" est à l'aide d'un fichier commun qui sont importés dans tous les projets. Vous pouvez le faire manuellement (ou script) par l'ajout de ce fichier dans chaque projet, ou vous pouvez utiliser un global (par exemple dans
$(VCTargetsPath)\Platforms\Win32\ImportBefore
). Ensemble OutputPath dans le mondial et vous avez terminé. Je recommande vraiment à l'aide d'un fichier commun pour la définition d'à peu près tout (compilateur/linker/options des outils et tous les chemins) de toute façon, c'est une question de SÉCHER après tout. - C'est effectivement ce que j'avais déjà fait, mais j'ai rencontré un problème lorsque j'ai voulu faire le chemin de la sortie mondiale sur une solution de base de configuration (c'est à dire $(SolutionDir)bin\$(SolutionConfigurationName)\$(SolutionPlatformName)). Les macros exportés par MSBuild sont sur une base par projet et donc ne serait pas de travail si vous aviez projet de plates-formes qui ne sont pas complètement nommés. J'ai finalement trouvé un Visual Studio plugin pour exporter ces pour moi depuis l'EDI. J'ai dû ruser un peu pour le rendre à l'exportation plus tôt et ne pas le casser VS fonctionnalité, mais je suis satisfait aujourd'hui.
Vous devez vous connecter pour publier un commentaire.
Visual Studio sera malheureusement échapper les caractères spéciaux lors de la modification des propriétés du projet.
Pour résoudre ce problème, modifiez votre .csproj fichier directement dans un éditeur de texte.
Par exemple, de modifier:
à:
<OutputPath>
à$(SolutionDir)\bin\Debug
, il apparaît comme..\..\..\bin\Debug
dans Visual Studio 2013. La bonne nouvelle, c'est que la macro restera intacte. Comme prévu, si vous apportez des modifications à laOutput Path:
dans Visual Studio... puis la macro sera supprimé. FYI - Microsoft utilise ce site pour aider à prioriser les demandes de fonctionnalités: UserVoice.comVoici ce que j'ai fait:
Le problème que j'essayais de résoudre n'est pas de me répéter (D. R. Y.) et la spécification d'une solution à l'échelle répertoire de sortie (dans une solution avec un grand nombre de projets) - c'est lors de la compilation d'une solution, tous les projets ont leur répertoire de sortie défini comme
$(SolutionDir)bin\Debug
ou$(SolutionDir)bin\Release
. Il est intéressant de mentionner que certains projets sont inclus dans l'ensemble des référentiels et en plus d'une solution.Au premier abord, j'ai créé un fichier MSBuild (un
<Project>
XML appeléMySolution.sln.targets
). Pour cela, j'ai défini un<PropertyGroup>
qui l'emportait sur la<OutputPath>
propriété:Puis j'ai ajouté la suite de l'importation de tous les projets pertinents, avant de la construire des objectifs d'importation:
De cette manière, chaque solution a un accompagnement
.targets
fichier de définition de ces choses que je veux être la solution à l'échelle.Cela a bien fonctionné, mais ensuite, j'ai rencontré le problème suivant: précitées
$(Platform)
et$(Configuration)
macros, reportez-vous à la projet propriétés, pas de la solution-larges. Qu'arriverait-il si ma solution est de Débogage/CPU configuration encore construit très spécifiques du projet dans sa configuration de Version? Pour autant que je suis au courant, après un examen approfondi de la documentation, aucun de ces macros sont exportés qui ont une solution à l'échelle de la granularité.J'ai trouvé ceztko de l'extension de Visual Studio qui fait de Visual Studio à l'exportation exactement les macros que j'ai été à la recherche pour - mais après une période d'expérimentation et de jouer du violon, j'ai découvert que cette extension set trop tard - seulement sur la construction de la solution. Cela a causé des problèmes avec Visual Studio supplémentaires fonctionnalités de génération - Il arrêtais pas de penser que les projets n'étaient pas à jour, car il était à la recherche dans le mauvais endroit, il n'était pas au courant de l'variables, mais MSBuild.exe a été.
J'ai commencé à jouer avec les
IVsUpdateSolutionEvents
interface, le suivi lorsqu'chaque méthode est appelée - et alors découvert queIVsUpdateSolutionEvents.OnActiveProjectCfgChange
est appelé à deux reprises lors de l'ouverture d'un 1-solution de projet, dans un nouveau Visual Studio, ou lors de la modification de la configuration de Débogage pour publication. En outre, la tripotent a révélé que si j'ai mis le projet de compiler en Release dans les deux configurations de solution, cette méthode m'a appelé une fois au lieu de deux fois lors de la modification des configurations de solution.Je bifurquais l'extension du référentiel et modifiée le problème en déplaçant les macro-réglage de la logique de cette méthode. Vous pouvez le trouver ici.
Avertissement: ceci ne peut pas interagir avec des lots des opérations de construction à partir de l'IDE, et vous oblige à l'exportation de ces propriétés de vous-même lors de la construction de MSBuild.exe's de la ligne de commande.
Bonne chance dans vos voyages.