private MinVerSettings CloneSettingsAndApplyEnvVariables(MinVerSettings settings)
        {
            var finalSettings = settings.Clone();

            finalSettings.AutoIncrement = settings.AutoIncrement ?? _environmentProvider
                                          .GetEnvironmentVariableAsEnum <MinVerAutoIncrement>(MinVerEnvironmentVariables.MINVERAUTOINCREMENT);

            if (string.IsNullOrWhiteSpace(finalSettings.BuildMetadata))
            {
                finalSettings.BuildMetadata = _environmentProvider
                                              .GetEnvironmentVariable(MinVerEnvironmentVariables.MINVERBUILDMETADATA);
            }

            if (string.IsNullOrWhiteSpace(finalSettings.DefaultPreReleasePhase))
            {
                finalSettings.DefaultPreReleasePhase = _environmentProvider
                                                       .GetEnvironmentVariable(MinVerEnvironmentVariables.MINVERDEFAULTPRERELEASEPHASE);
            }

            if (string.IsNullOrWhiteSpace(finalSettings.MinimumMajorMinor))
            {
                finalSettings.MinimumMajorMinor = _environmentProvider
                                                  .GetEnvironmentVariable(MinVerEnvironmentVariables.MINVERMINIMUMMAJORMINOR);
            }

            if (string.IsNullOrWhiteSpace(finalSettings.TagPrefix))
            {
                finalSettings.TagPrefix = _environmentProvider
                                          .GetEnvironmentVariable(MinVerEnvironmentVariables.MINVERTAGPREFIX);
            }

            finalSettings.PreferGlobalTool ??= _environmentProvider
            .GetEnvironmentVariableAsBool(MinVerEnvironmentVariables.MINVERPREFERGLOBALTOOL);

            finalSettings.NoFallback ??= _environmentProvider
            .GetEnvironmentVariableAsBool(MinVerEnvironmentVariables.MINVERNOFALLBACK);

            finalSettings.Verbosity ??= _environmentProvider
            .GetEnvironmentVariableAsEnum <MinVerVerbosity>(MinVerEnvironmentVariables.MINVERVERBOSITY);

            finalSettings.ToolPath ??= _environmentProvider
            .GetEnvironmentVariableAsFilePath(MinVerEnvironmentVariables.MINVERTOOLPATH);

            if (!(finalSettings.ToolPath is null))
            {
                // If ToolPath is specified, it means it's a global tool in a custom location (also known as a tool-path tool)
                // https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools
                finalSettings.PreferGlobalTool = true;

                // If ToolPath is specified, we try to run that specific tool only... No fallback
                finalSettings.NoFallback = true;
            }

            return(finalSettings);
        }