код автоформата из командной строки

Можно ли запустить код автоматического форматирования для всех или для конкретного файла в решении, например форматирование (Ctrl+K, Ctrl+D) в Visual Studio, но из командной строки? Или использовать очистку Resharper также из командной строки для файлов решений?


person Александр Киричек    schedule 22.03.2013    source источник
comment
Вы пробовали что-нибудь? Не могли бы вы показать нам?   -  person Hanlet Escaño    schedule 23.03.2013
comment
Я не думаю (я afk atm, поэтому не могу проверить), что Ctrl + K, Ctrl + D являются эксклюзивными для ReSharper, поэтому, возможно, этот тег в вашем вопросе не нужен!   -  person JMK    schedule 23.03.2013
comment
В этом ответе говорится, что Resharper API бесполезен: > stackoverflow.com/questions/13729649/ Это предложение narrange.net/doc/index .htm предоставляет сторонний консольный инструмент. Интересно, есть ли что-то новое в новых версиях VS2012, добавляющее такие новые возможности в командную строку?   -  person Александр Киричек    schedule 23.03.2013
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 23.03.2013
comment
Спасибо, Джон. JMK, Ctrl+K, Ctrl+D для IDE. Для Resharper эксклюзив — это очистка.   -  person Александр Киричек    schedule 23.03.2013


Ответы (5)


Чтобы отформатировать исходный код net core c#, используйте https://github.com/dotnet/format.

Установите инструмент согласно файлу readme проекта.

Мне нужно было отформатировать некоторые файлы кода, которые я создавал из шаблонов Razor. Я создал файл оболочки .CSProj в корне моей выходной папки, используя dotnet new console, который дает вам этот базовый файл:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <RootNamespace>dotnet_format</RootNamespace>
  </PropertyGroup>

</Project>

Затем запустите dotnet format из командной строки VS в этой папке. Он будет рекурсивно перемещаться по подкаталогам и форматировать все, что найдет. Чтобы отформатировать определенные файлы, вы можете предоставить список имен файлов с переключателем --files.

person Daz    schedule 05.08.2019

Создайте свой собственный инструмент. Вы можете использовать EnvDTE, EnvDTE80 для создания проекта Visual Studio и загрузки файлов, которые вы хотите отформатировать, на лету. Когда вы закончите, удалите проект Visual Studio. Вы можете указать, чтобы окно Visual Studio не отображалось во время форматирования. Если вам интересно, дайте мне знать, я могу дать вам код, чтобы это работало.

ОБНОВЛЕНИЕ: я копирую код, который у меня есть. Я использовал его для форматирования файлов *.js. Я удалил код, который вам не нужен. Не стесняйтесь спрашивать, если это не работает.

    //You need to make a reference to two dlls:
    envdte
    envdte80



    void FormatFiles(List<FileInfo> files)
    {       
        //If it throws exeption you may want to retry couple more times
        EnvDTE.Solution soln = System.Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.Solution.11.0")) as EnvDTE.Solution;
        //try this if you have Visual Studio 2010
        //EnvDTE.Solution soln = System.Activator.CreateInstance(Type.GetTypeFromProgID("VisualStudio.Solution.10.0")) as EnvDTE.Solution;
        soln.DTE.MainWindow.Visible = false;
        EnvDTE80.Solution2 soln2 = soln as EnvDTE80.Solution2;
        //Creating Visual Studio project
        string csTemplatePath = soln2.GetProjectTemplate("ConsoleApplication.zip", "CSharp");
        soln.AddFromTemplate(csTemplatePath, tempPath, "FormattingFiles", false);
        //If it throws exeption you may want to retry couple more times
        Project project = soln.Projects.Item(1);

        foreach (FileInfo file in files)
        {
            ProjectItem addedItem;
            bool existingFile = false;
            int _try = 0;
            while (true)
            {            
                try
                {
                    string fileName = file.Name;
                    _try++;
                    if (existingFile)
                    {
                        fileName = file.Name.Substring(0, (file.Name.Length - file.Extension.Length) - 1);
                        fileName = fileName + "_" + _try + file.Extension;
                    }
                    addedItem = project.ProjectItems.AddFromTemplate(file.FullName, fileName);
                    existingFile = false;
                    break;
                }
                catch(Exception ex)
                {
                    if (ex.Message.Contains(file.Name) && ex.Message.Contains("already a linked file"))
                    {
                        existingFile = true;
                    }
                }
            }
            while (true)
            {
                //sometimes formatting file might throw an exception. Thats why I am using loop.
                //usually first time will work
                try
                {
                    addedItem.Open(Constants.vsViewKindCode);
                    addedItem.Document.Activate();
                    addedItem.Document.DTE.ExecuteCommand("Edit.FormatDocument");
                    addedItem.SaveAs(file.FullName);
                    break;
                }
                catch
                {
                    //repeat
                }
            }
        }
        try
        {
            soln.Close();
            soln2.Close();
            soln = null;
            soln2 = null;
        }
        catch
        {
            //for some reason throws exception. Not all the times.
            //if this doesn't closes the solution CleanUp() will take care of this thing
        }
        finally
        {
            CleanUp();
        }
    }   

    void CleanUp()
    {
        List<System.Diagnostics.Process> visualStudioProcesses = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName.Contains("devenv")).ToList();
        foreach (System.Diagnostics.Process process in visualStudioProcesses)
        {
            if (process.MainWindowTitle == "")
            {
                process.Kill();
                break;
            }
        }
        tempPath = System.IO.Path.GetTempPath();
        tempPath = tempPath + "\\FormattingFiles";
        new DirectoryInfo(tempPath).Delete(true);
    } 

Надеюсь, это поможет.

person Dilshod    schedule 22.03.2013
comment
COMExceptions можно легко решить, правильно внедрив фильтрацию сообщений, как описано здесь. - person Michal Hosala; 06.04.2016

В дополнение к сообщению Дилшода, если вы просто хотите отформатировать один файл, вот способ сделать это, не требующий временного пути:

static void FormatFile(string file)
{
    EnvDTE.Solution soln = System.Activator.CreateInstance(
        Type.GetTypeFromProgID("VisualStudio.Solution.10.0")) as EnvDTE.Solution;

    soln.DTE.ItemOperations.OpenFile(file);

    TextSelection selection = soln.DTE.ActiveDocument.Selection as TextSelection;
    selection.SelectAll();
    selection.SmartFormat();

    soln.DTE.ActiveDocument.Save();
}

Обратите внимание, что «файл» должен иметь полный путь на диске, по всей вероятности. Относительные пути, похоже, не работают (хотя я не очень старался).

person Jay Lemmon    schedule 19.04.2013
comment
Кроме того, для полноты вы, вероятно, захотите реализовать этот прослушиватель COM для обнаружения некоторых случайных ошибок занятости, которые вы можете получить: msdn.microsoft.com/en-us/library/ms228772.aspx - person Jay Lemmon; 08.12.2013
comment
Это решение не работает для меня. Выдает ошибки при попытке использовать SmartFormat. Я также реализовал MessageFilter - person Patrick Magee; 17.04.2015
comment
Какую версию Visual Studio вы используете? Вам нужно убедиться, что ваша версия VisualStudio.Solution.10.0 соответствует вашей версии. например: для VS2013 это должно быть VisualStudio.Solution.12.0. Если это не сработает, вы можете посмотреть, чем я сейчас занимаюсь, по адресу svn.darwinbots.com/Darwinbots3/Trunk/Modules/Reformatter/ и посмотреть, есть ли там что-то, что я не упоминаю. На моей машине работает :) - person Jay Lemmon; 17.04.2015
comment
Привет, Джей, спасибо за ответ. Я закончил тем, что использовал Tools.CommandWindow и использовал document.Activate();, а затем CommandWindow.SendInput("Edit.FormatDocument") - person Patrick Magee; 20.04.2015
comment
@PatrickMagee, не могли бы вы опубликовать полные решения, я столкнулся с той же проблемой и не знаю, как ее решить. Спасибо! - person user1935724; 31.10.2017

Используйте CodeFormatter от команды .NET.

  1. Установите MSBuild Tools 2015.
  2. Загрузите CodeFormatter 1.0.0-alpha6.
  3. Добавьте CodeFormatter.csproj в корневой каталог ваших проектов:

CodeFormatter.csproj

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <Compile Include="**\*.cs" />
  </ItemGroup>
  <Target Name="Compile">
    <Csc Sources="@(Compile)"/>
  </Target>
</Project>

Затем запустите это из командной строки.

> codeformatter.exe CodeFormatter.csproj /nocopyright

В результате все файлы C# ваших проектов теперь соответствуют большинству .NET Foundation рекомендации по кодированию.

Примечания

  • Установка MSBuild Tools 2015 означает, что нам не нужна Visual Studio.
  • Добавление CodeFormatter.csproj в корневой каталог рекурсивно включает все файлы C#, что означает, что описанное выше работает с установками на основе project.json и *.xproj.

Смотрите также

http://bigfontblog.azurewebsites.net/autoformat/

person Shaun Luttin    schedule 14.01.2017

Невозможно в Visual Studio, но для этого есть утилиты командной строки: http://astyle.sourceforge.net/astyle.html

person DasKrümelmonster    schedule 22.03.2013
comment
Отлично, спасибо, это действительно решение. Но последнее обновление этого проекта на исходниках 2011-11-21. Последнее обновление NArrange: 25 мая 2011 г. Возможно, появилось что-то новое. - person Александр Киричек; 23.03.2013