Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

UPDATE: Я копирую код, который у меня есть. Я использовал его для форматирования *.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);
    } 

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

Ответ 2

Как продолжение записи Dilshod, если вы просто хотите форматировать один файл, вот способ сделать это, что не потребуется временный путь:

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();
}

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

Ответ 4

Использовать CodeFormatter из .NET Team

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

Результат: все файлы С# для ваших проектов теперь соответствуют большинству основных принципов .NET Framework .

Примечания

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

См. также

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