Можно ли запустить код автоматического форматирования для всех или для конкретного файла в решении, например форматирование (Ctrl+K, Ctrl+D) в Visual Studio, но из командной строки? Или использовать очистку Resharper также из командной строки для файлов решений?
код автоформата из командной строки
Ответы (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
.
Создайте свой собственный инструмент. Вы можете использовать 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);
}
Надеюсь, это поможет.
В дополнение к сообщению Дилшода, если вы просто хотите отформатировать один файл, вот способ сделать это, не требующий временного пути:
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();
}
Обратите внимание, что «файл» должен иметь полный путь на диске, по всей вероятности. Относительные пути, похоже, не работают (хотя я не очень старался).
SmartFormat
. Я также реализовал MessageFilter
- person Patrick Magee; 17.04.2015
Tools.CommandWindow
и использовал document.Activate();
, а затем CommandWindow.SendInput("Edit.FormatDocument")
- person Patrick Magee; 20.04.2015
Используйте CodeFormatter от команды .NET.
- Установите MSBuild Tools 2015.
- Загрузите CodeFormatter 1.0.0-alpha6.
- Добавьте
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/
Невозможно в Visual Studio, но для этого есть утилиты командной строки: http://astyle.sourceforge.net/astyle.html