TeamCity.CSharpInteractive/DotnetEnvironment.cs (57 lines of code) (raw):
// ReSharper disable ClassNeverInstantiated.Global
// ReSharper disable UnusedMember.Global
namespace TeamCity.CSharpInteractive;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.InteropServices;
using Microsoft.DotNet.PlatformAbstractions;
internal class DotNetEnvironment : IDotNetEnvironment, ITraceSource
{
private readonly string _moduleFile;
private readonly IEnvironment _environment;
private readonly IFileExplorer _fileExplorer;
public DotNetEnvironment(
[Tag("TargetFrameworkMoniker")] string targetFrameworkMoniker,
[Tag("ModuleFile")] string moduleFile,
IEnvironment environment,
IFileExplorer fileExplorer)
{
_moduleFile = moduleFile;
_environment = environment;
_fileExplorer = fileExplorer;
TargetFrameworkMoniker = targetFrameworkMoniker;
}
public string Path
{
get
{
var executable = _environment.OperatingSystemPlatform == Platform.Windows ? "dotnet.exe" : "dotnet";
try
{
if (System.IO.Path.GetFileName(_moduleFile).Equals(executable, StringComparison.InvariantCultureIgnoreCase))
{
System.Console.WriteLine($"From module {_moduleFile}");
return _moduleFile;
}
return _fileExplorer.FindFiles(executable, "DOTNET_ROOT", "DOTNET_HOME").FirstOrDefault() ?? executable;
}
catch
{
// ignored
}
return executable;
}
}
public string TargetFrameworkMoniker { get; }
[ExcludeFromCodeCoverage]
public IEnumerable<Text> Trace
{
get
{
yield return new Text($"FrameworkDescription: {RuntimeInformation.FrameworkDescription}");
yield return Text.NewLine;
yield return new Text($"Default C# version: {ScriptCommandFactory.ParseOptions.LanguageVersion}");
yield return Text.NewLine;
yield return new Text($"DotNetPath: {Path}");
yield return Text.NewLine;
yield return new Text($"TargetFrameworkMoniker: {TargetFrameworkMoniker}");
yield return Text.NewLine;
}
}
}