是否可以在解决方案中为所有或特定文件运行自动格式代码,例如在Visual Studio中使用(Ctrl + K,Ctrl + D)格式,但是从它的命令行? 或者也可以从解决方案文件的命令行中使用Resharper的清理工作?
答案 0 :(得分:12)
创建自己的工具。您可以使用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);
}
我希望这会有所帮助。
答案 1 :(得分:4)
作为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();
}
请注意,“file”将需要在磁盘上拥有完整路径。相对路径似乎不起作用(尽管我并没有那么努力)。
答案 2 :(得分:2)
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
结果:您的所有项目&#39; C#文件现在遵循大多数.NET Foundation coding guidelines。
CodeFormatter.csproj
包括所有C#文件,这意味着上述内容适用于project.json和基于* .xproj的设置。答案 3 :(得分:1)
使用Visual Studio不可行,但有一些命令行实用程序:http://astyle.sourceforge.net/astyle.html
答案 4 :(得分:1)
要格式化网络核心c#源,请使用https://github.com/dotnet/format
根据项目自述文件安装工具。
我需要格式化一些我从Razor模板生成的代码文件。我使用dotnet new console
在输出文件夹的根目录中创建了一个外壳.CSProj文件,它为您提供了以下基本文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RootNamespace>dotnet_format</RootNamespace>
</PropertyGroup>
</Project>
然后从该文件夹中的VS命令提示符运行dotnet format
。它将递归到子目录并格式化找到的所有内容。要格式化特定文件,您可以使用--files
开关提供文件名列表。