dotnet / format

Home for the dotnet-format command
MIT License
1.92k stars 174 forks source link

--folder option is different in SDK bundled tool vs. mainline #1385

Open am11 opened 2 years ago

am11 commented 2 years ago

Using the nightly (5 hours old) .NET SDK 6.0.100-rtm.21514.1 with bundled dotnet-format, --folder option doesn't have any effect.

$ dotnet6 format --version
6.0.251401+3ec0d2e1ffc98b76dca28aa23326ba0a1425dd82

# note that despite --folder, it is trying to load the workspace from csproj
$ ls *.cs | dotnet6 format --include - --folder -v:d
  The dotnet runtime version is '6.0.0-rtm.21513.22'.
  Formatting code files in workspace '/home/am11/projects/cs1/cs1.csproj'.
    Determining projects to restore...
  Restored /home/am11/projects/cs1/cs1.csproj (in 251 ms).
  Project cs1 is using configuration from '/home/am11/projects/cs1/obj/Debug/net5.0/cs1.GeneratedMSBuildEditorConfig.editorconfig'.
  Project cs1 is using configuration from '/home/am11/.dotnet6/sdk/6.0.100-rtm.21514.1/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_5_default.editorconfig'.
  Running 1 analyzers on cs1.
  Formatted 0 of 4 files.
  Format complete in 10099ms.

with latest 5x (3 days old) downloaded from nuget.org, we get:

$ dotnet-format --version
5.1.250801+4a851ea9707f87d381166c2fc2b2d4b58a10a222

$ ls *.cs | dotnet-format --include - --folder -v:d
  The dotnet format version is '5.1.250801+4a851ea9707f87d381166c2fc2b2d4b58a10a222'.
  Formatting code files in workspace '/home/am11/projects/cs1'.
/home/am11/projects/cs1/Program.cs(1,1): error WHITESPACE: Fix whitespace formatting. [/home/am11/projects/cs1]
/home/am11/projects/cs1/Program2.cs(1,1): error WHITESPACE: Fix whitespace formatting. [/home/am11/projects/cs1]
  Formatted code file '/home/am11/projects/cs1/Program.cs'.
  Formatted code file '/home/am11/projects/cs1/Program2.cs'.
  Formatted 2 of 2 files.
  Format complete in 3514ms.

The expected behavior implemented by https://github.com/dotnet/format/pull/790.

Was it intentionally dropped out of .NET 6?

JoeRobich commented 2 years ago

@Am11 As part of our move into the dotnet SDK, we reworked our options (see breaking changes listed in https://github.com/dotnet/format/issues/1292). The --folder option is now under the whitespace subcommand (dotnet whitespace --folder). I am surprised there was no warning about using an invalid option against the root command.

am11 commented 2 years ago

@JoeRobich, thanks for the info. I am still lost on the why part; was the --folder option conflicting with something in the SDK scenario? Some non-whitespace rules we are using work fine with dotnet format --include *.cs --folder:

[*.{cs,vb}]
# Organize usings
dotnet_separate_import_directive_groups = true
dotnet_sort_system_directives_first = true

# IDE0005: Using directive is unnecessary.
#     (this does not work with --folder, but it's fine,
#      it just gets skipped in a non-fatal manner)
dotnet_diagnostic.IDE0005.severity = warning

now with .NET 6 SDK's dotnet format whitespcae --include *.cs --folder, it has no effect since --folder has been stripped down to to a whitespace-only option.

JoeRobich commented 2 years ago

@am11 The default dotnet format command was expanded from only applying whitespace formatting to also applying code style and third-party analyzer fixes by default. Since the --folder command has always been a whitespace-only option it was moved under the whitespace subcommand.

You also got hit by another breaking change, the organize imports formatter was moved from a whitespace formatter to be a style formatter, since it was not whitespace related and was in fact enforcing a code style rule. There has been some discussion about possibly enabling the --folder option to the subset of the code style formatting and fixing that does not require semantic information but, without hearing more feedback, it is not a priority.

CC: @jmarolf in case you have any thoughts

jmarolf commented 2 years ago

would need to understand if --folder was used for performance or some other reason. If it was just performance then I would prefer to just make everything faster.

am11 commented 2 years ago

Yup, I'm mainly using it for performance because the default, project workspace, takes ages in large projects. :slightly_smiling_face:

cliffchapmanrbx commented 2 years ago

As we're rolling out .NET 6 across our build infrastructure we got burned by this today.

We have a repository with over 1700 separate csproj files and around 800 SLN files. All told there's approximately 5.5 million LoC in the repo. To keep the entire repository in line we've been using an automated dotnet tool run dotnet-format --folder . command on the root of the repo for automatically applying fixes to folk's pull requests. This workflow has worked great to keep things in check, especially as we have a well defined .editorconfig based on the Roslyn one with all of the rules written out.

It doesn't appear that there is any way to replicate the current 5.X folder functionality, as the --folder option is only available for whitespace and not style.

maxisam commented 11 months ago

@cliffchapmanrbx i am trying to solve the same issue as well. My current solution is create a custom github action find out what projects are involved in the change and use matrix to run dotnet format targeting those projects separately. I wonder what is your solution in the end?