add --log-path argument to specify SMAPI log path during testing

This commit is contained in:
Jesse Plamondon-Willard 2017-04-01 16:08:31 -04:00
parent c023118356
commit 4675da0600
4 changed files with 30 additions and 7 deletions

View File

@ -145,9 +145,10 @@ field | purpose
`ModCompatibility` | A list of mod versions SMAPI should consider compatible or broken regardless of whether it detects incompatible code. Each record can be set to `AssumeCompatible` or `AssumeBroken`. Changing this field is not recommended and may destabilise your game.
### Command-line arguments
SMAPI recognises the following command-line arguments. These are intended for internal use and may
change without warning.
SMAPI recognises the following command-line arguments. These are intended for internal use or
testing and may change without warning.
argument | purpose
-------- | -------
`--log path "path"` | The relative or absolute path of the log file SMAPI should write.
`--no-terminal` | SMAPI won't write anything to the console window. (Messages will still be written to the log file.)

View File

@ -43,6 +43,7 @@ For mod developers:
* Added `ContentEvents.AfterLocaleChanged` event triggered when the player changes the content language (for the upcoming Stardew Valley 1.2).
* Added `SaveEvents.AfterReturnToTitle` event triggered when the player returns to the title screen (for the upcoming Stardew Valley 1.2).
* Added `helper.Reflection.GetPrivateProperty` method.
* Added a `--log-path` argument to specify the SMAPI log path during testing.
* SMAPI now writes XNA input enums (`Buttons` and `Keys`) to JSON as strings automatically, so mods no longer need to add a `StringEnumConverter` themselves for those.
* The SMAPI log now has a simpler filename.
* The SMAPI log now shows the OS caption (like "Windows 10") instead of its internal version when available.

View File

@ -69,7 +69,7 @@ namespace StardewModdingAPI
internal static string ApiConfigPath => Path.Combine(Constants.ExecutionPath, $"{typeof(Program).Assembly.GetName().Name}.config.json");
/// <summary>The file path to the log where the latest output should be saved.</summary>
internal static string LogPath => Path.Combine(Constants.LogDir, "SMAPI-latest.txt");
internal static string DefaultLogPath => Path.Combine(Constants.LogDir, "SMAPI-latest.txt");
/// <summary>The full path to the folder containing mods.</summary>
internal static string ModPath { get; } = Path.Combine(Constants.ExecutionPath, "Mods");

View File

@ -30,7 +30,7 @@ namespace StardewModdingAPI
** Properties
*********/
/// <summary>The log file to which to write messages.</summary>
private readonly LogFileManager LogFile = new LogFileManager(Constants.LogPath);
private readonly LogFileManager LogFile;
/// <summary>Manages console output interception.</summary>
private readonly ConsoleInterceptionManager ConsoleManager = new ConsoleInterceptionManager();
@ -67,17 +67,38 @@ namespace StardewModdingAPI
/// <param name="args">The command-line arguments.</param>
private static void Main(string[] args)
{
new Program(writeToConsole: !args.Contains("--no-terminal"))
// get flags from arguments
bool writeToConsole = !args.Contains("--no-terminal");
// get log path from arguments
string logPath = null;
{
int pathIndex = Array.LastIndexOf(args, "--log-path") + 1;
if (pathIndex >= 1 && args.Length >= pathIndex)
{
logPath = args[pathIndex];
if (!Path.IsPathRooted(logPath))
logPath = Path.Combine(Constants.LogDir, logPath);
}
}
if (string.IsNullOrWhiteSpace(logPath))
logPath = Constants.DefaultLogPath;
// load SMAPI
new Program(writeToConsole, logPath)
.LaunchInteractively();
}
/// <summary>Construct an instance.</summary>
internal Program(bool writeToConsole)
/// <param name="writeToConsole">Whether to output log messages to the console.</param>
/// <param name="logPath">The full file path to which to write log messages.</param>
internal Program(bool writeToConsole, string logPath)
{
// load settings
this.Settings = JsonConvert.DeserializeObject<SConfig>(File.ReadAllText(Constants.ApiConfigPath));
// initialise
this.LogFile = new LogFileManager(logPath);
this.Monitor = new Monitor("SMAPI", this.ConsoleManager, this.LogFile, this.ExitGameImmediately) { WriteToConsole = writeToConsole };
this.ModRegistry = new ModRegistry(this.Settings.ModCompatibility);
this.DeprecationManager = new DeprecationManager(this.Monitor, this.ModRegistry);
@ -460,7 +481,7 @@ namespace StardewModdingAPI
try
{
int modEntries = modAssembly.DefinedTypes.Count(type => typeof(Mod).IsAssignableFrom(type) && !type.IsAbstract);
if(modEntries == 0)
if (modEntries == 0)
{
this.Monitor.Log($"{skippedPrefix} because its DLL has no '{nameof(Mod)}' subclass.", LogLevel.Error);
continue;