J'ai ajouté des cibles supplémentaires à un fichier .csproj
afin d'effectuer des tâches supplémentaires une fois la construction du projet terminée.
Rien n'apparaît dans la fenêtre de sortie de Visual Studio tant que tout les objectifs sont terminés. Je veux pouvoir voir les messages qui se produisent pendant le traitement des cibles.
Si j'utilise l'explorateur de tâches MSBuild (une extension VS), je peux voir que les messages peuvent être captés par un visuel Fenêtre Studio au fur et à mesure qu'elles sont générées, est-ce que je manque juste un paramètre quelque part?
J'ai également essayé de remplacer les tâches Exec
par SmartExec
de la Package MSBuild Extensions.
Voici un extrait de mon fichier de projet .csproj
:
<Target Name="PostBuildActions" AfterTargets="Build"> <!--Get the version number from the assembly info --> <GetAssemblyIdentity AssemblyFiles="$(ProjectDir)$(OutputPath)$(TargetFileName)"> <Output TaskParameter="Assemblies" ItemName="ToolboxVersion" /> </GetAssemblyIdentity> <CreateProperty Value="$(ProjectDir)$(OutputPath.TrimEnd('\'))"> <Output TaskParameter="Value" PropertyName="ToolboxTarget" /> </CreateProperty> <!-- Run the Simulink Widget Generator tool --> <CreateProperty Value=""$(SolutionDir)SimulinkWidgetGenerator\bin\$(Configuration)\SimulinkWidgetGenerator.exe" -v %(ToolboxVersion.Version) -d "$(ToolboxTarget)""> <Output TaskParameter="Value" PropertyName="WidgetGenCommand" /> </CreateProperty> <Message Text="Running Simulink Widget Generator:" Importance="High" /> <Message Text="$(WidgetGenCommand)" Importance="High" /> <Exec Command="$(WidgetGenCommand)" ConsoleToMSBuild="true" /> <!-- Invoke Matlab --> <CreateProperty Value="try, PackageToolbox, catch ex, disp(getReport(ex)), exit(-1), end, exit(0);"> <Output TaskParameter="Value" PropertyName="MatlabScript" /> </CreateProperty> <CreateProperty Value=""$(MATLAB_INSTALL_DIR)\bin\matlab.exe" -automation -wait -log -sd "$(ToolboxTarget)" -r "$(MatlabScript)""> <Output TaskParameter="Value" PropertyName="MatlabCommand" /> </CreateProperty> <Message Text="Invoking Matlab: " Importance="High" /> <Message Text="$(MatlabCommand)" Importance="High" /> <Exec Command="$(MatlabCommand)" ConsoleToMSBuild="true" />
p>
3 Réponses :
Dans Visual Studio , vous pouvez configurer votre verbosité MSBuild dans Outils -> Options -> Projets et solutions -> Générer et exécuter .
De ici :
Verbosité définie sur Silencieux - indique la réussite ou l'échec de la compilation. 1 ligne affichée ci-dessous pour une compilation réussie.
Verbosité définie sur Minimale - affiche la ligne de commande de la compilation. 2 lignes affichées pour une reconstruction réussie.
Verbosité définie sur Normale . Affiche la sortie des cibles MSBuild. 25 lignes affichées pour une reconstruction réussie.
Verbosité définie sur Détaillée . Beaucoup plus de commentaires affichés de MSBuild. 395 lignes affichées pour une compilation réussie.
Enfin, la verbosité définie sur Diagnostic vous montre tout. 1097 lignes affichées pour une compilation réussie.
La question ne porte pas sur le contenu de la fenêtre de sortie (que ce paramètre affecte), mais sur le moment où la sortie apparaît. Je veux que la sortie apparaisse telle qu'elle est générée pendant le processus de construction. Il n'apparaît qu'à la fin, une fois le processus de construction terminé.
Pour ce problème, je vous recommande d'utiliser la commande msbuild comme msbuild xxx.csproj par l'invite de commande du développeur pour voir les cibles en cours de traitement.
Est-ce que je manque juste un paramètre quelque part?
Non, en effet vous avez raison et pour l'instant, la sortie dans Visual studio ne semble pas prendre en charge l'affichage en temps réel après mon test.
Détails pour décrire cette situation:
Comme nous le savons, il y a deux façons de construire par rapport au projet: 1. Générez dans Visual Studio 2. Msbuild.exe.
Le processus de construction dans VS (# 1) appelle en fait l'outil Msbuild (# 2) pour fonctionner.
L'outil Msbuild affichera la cible dans une fenêtre de console en temps réel.
Et dans VS, la sortie de sa construction semble être un non-temps réel log, qui s'affichera après la fin du processus de construction. Si nous ajoutons une opération chronophage comme la vôtre, elle ne s'affichera pas avant la fin de la commande. J'ai fait un test pour cela, créé un simple test.csproj et ajouté un script comme celui-ci:
<Target Name="WaitingToDoSth" AfterTargets="Test1"> <Exec Command="$(ProjectDir)DoSth.exe"/> </Target>Ce DoSth.exe a un Thread.sleep (3000) dedans. Dans VS, la sortie n'affichera rien jusqu'à ce que DoSth.exe s'exécute avec succès et que l'ensemble du processus de construction se termine. Lorsque vous utilisez la commande msbuild xxx.csproj dans l'invite de commande du développeur pour VS2017, l'affichage peut être en temps réel et nous pouvons voir les messages qui se produisent pendant le traitement des cibles.
Si ma réponse est utile, veuillez donner une rétroaction. Merci.
Merci. Vous avez confirmé ce que je soupçonnais. Cependant, je suis confus que la tâche d'extension SmartExec MSBuild ne résout pas ce problème car il semble que c'est ce à quoi elle est destinée.
Je ne sais pas pourquoi, mais l'extension a quelque chose qui ne va pas de mon côté. Cela semble ne pas fonctionner dans ma dernière version vs (ou peut-être que je l'utilise dans le mauvais sens). Pour cela, je pense que vous pouvez lui demander cela dans VSX MarketPlace. Et merci pour vos commentaires.
La clé pour voir la sortie MSBuild en temps réel est d'utiliser le SDK du projet MSBuild . Merci à rainersigwald qui a publié cette solution sur GitHub :
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.0</TargetFramework> <RootNamespace>_5451</RootNamespace> </PropertyGroup> <Target Name="LogStuffInRealTime" BeforeTargets="CoreCompile"> <Exec Command="ping 127.0.0.1" YieldDuringToolExecution="True" ConsoleToMSBuild="true" StandardOutputImportance="high"> <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" /> </Exec> </Target> </Project>
Cela fonctionne-t-il uniquement pour les projets .NET? J'ai un projet d'installation WIX (.wixproj) qui contient un certain nombre d'étapes de récolte de sortie que je voudrais afficher en temps réel. J'ai également un projet C ++ qui comprend une étape qui nécessite la compilation d'éléments dans Matlab où la sortie en temps réel serait très utile.
Un gars de Microsoft m'a dit que la sortie en temps réel de msbuild "devrait" également fonctionner avec les fichiers de projet de style plus ancien. Je vais probablement ouvrir un problème car cela ne semble pas être le cas. J'ai plusieurs exemples différents ici: github.com/gojimmypi/msbuildCustomTask
oh - et assurez-vous de consulter ce problème que j'ai ouvert: github.com/microsoft/msbuild/issues / 5486 "La compilation de NET.Sdk s'exécute de manière inattendue"