2015-11-21 03:00:56 +00:00
|
|
|
|
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
|
|
|
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
using Microsoft.DotNet.Cli.Utils;
|
2015-11-28 00:19:54 +00:00
|
|
|
|
using Microsoft.DotNet.ProjectModel;
|
2015-11-21 03:00:56 +00:00
|
|
|
|
using NuGet.Frameworks;
|
|
|
|
|
|
|
|
|
|
namespace Microsoft.DotNet.Tools.Run
|
|
|
|
|
{
|
2016-01-31 05:47:50 +00:00
|
|
|
|
public partial class RunCommand
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
|
|
|
|
public string Framework = null;
|
|
|
|
|
public string Configuration = null;
|
|
|
|
|
public string Project = null;
|
|
|
|
|
public IReadOnlyList<string> Args = null;
|
|
|
|
|
|
|
|
|
|
ProjectContext _context;
|
|
|
|
|
List<string> _args;
|
|
|
|
|
|
|
|
|
|
public int Start()
|
|
|
|
|
{
|
2015-11-24 00:31:27 +00:00
|
|
|
|
if (IsInteractive())
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
|
|
|
|
return RunInteractive(Project);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return RunExecutable();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-24 00:31:27 +00:00
|
|
|
|
private bool IsInteractive()
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(Project))
|
|
|
|
|
{
|
2015-11-24 00:31:27 +00:00
|
|
|
|
if (File.Exists(Project) && (Path.GetExtension(Project).ToLowerInvariant() == ".csx"))
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
2015-11-24 00:31:27 +00:00
|
|
|
|
return true;
|
2015-11-21 03:00:56 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2015-11-24 00:31:27 +00:00
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void CalculateDefaultsForNonAssigned()
|
|
|
|
|
{
|
2015-11-24 03:58:11 +00:00
|
|
|
|
if (string.IsNullOrWhiteSpace(Project))
|
|
|
|
|
{
|
|
|
|
|
Project = Directory.GetCurrentDirectory();
|
|
|
|
|
}
|
2015-11-21 03:00:56 +00:00
|
|
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(Configuration))
|
|
|
|
|
{
|
|
|
|
|
Configuration = Constants.DefaultConfiguration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var contexts = ProjectContext.CreateContextForEachFramework(Project);
|
|
|
|
|
if (Framework == null)
|
|
|
|
|
{
|
|
|
|
|
_context = contexts.First();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var fx = NuGetFramework.Parse(Framework);
|
|
|
|
|
_context = contexts.FirstOrDefault(c => c.TargetFramework.Equals(fx));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (Args == null)
|
|
|
|
|
{
|
|
|
|
|
_args = new List<string>();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_args = new List<string>(Args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private int RunExecutable()
|
|
|
|
|
{
|
2015-11-24 03:58:11 +00:00
|
|
|
|
CalculateDefaultsForNonAssigned();
|
|
|
|
|
|
2015-11-21 03:00:56 +00:00
|
|
|
|
// Compile to that directory
|
2016-02-03 20:04:09 +00:00
|
|
|
|
var result = Build.BuildCommand.Run(new[]
|
2016-02-05 03:12:02 +00:00
|
|
|
|
{
|
|
|
|
|
$"--framework",
|
|
|
|
|
$"{_context.TargetFramework}",
|
|
|
|
|
$"--configuration",
|
|
|
|
|
$"{Configuration}",
|
|
|
|
|
$"{_context.ProjectFile.ProjectDirectory}"
|
|
|
|
|
});
|
2015-11-21 03:00:56 +00:00
|
|
|
|
|
2016-02-03 20:04:09 +00:00
|
|
|
|
if (result != 0)
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
2016-02-03 20:04:09 +00:00
|
|
|
|
return result;
|
2015-11-21 03:00:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Now launch the output and give it the results
|
2016-02-05 03:12:02 +00:00
|
|
|
|
var outputName = _context.GetOutputPathCalculator().GetExecutablePath(Configuration);
|
2016-01-26 14:39:13 +00:00
|
|
|
|
|
2015-11-21 03:00:56 +00:00
|
|
|
|
if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
|
|
|
{
|
|
|
|
|
if (_context.TargetFramework.IsDesktop())
|
|
|
|
|
{
|
|
|
|
|
// Run mono if we're running a desktop target on non windows
|
2016-01-26 14:39:13 +00:00
|
|
|
|
_args.Insert(0, outputName);
|
2015-11-21 03:00:56 +00:00
|
|
|
|
|
|
|
|
|
if (string.Equals(Configuration, "Debug", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
// If we're compiling for the debug configuration then add the --debug flag
|
|
|
|
|
// other options may be passed using the MONO_OPTIONS env var
|
|
|
|
|
_args.Insert(0, "--debug");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
outputName = "mono";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Locate the runtime
|
2016-02-02 23:26:23 +00:00
|
|
|
|
string dotnetHome = Environment.GetEnvironmentVariable("DOTNET_HOME");
|
|
|
|
|
if (string.IsNullOrEmpty(dotnetHome))
|
2015-11-21 03:00:56 +00:00
|
|
|
|
{
|
|
|
|
|
// Use the runtime deployed with the tools, if present
|
2016-02-02 23:26:23 +00:00
|
|
|
|
var candidateBase = Path.Combine(AppContext.BaseDirectory, "..");
|
|
|
|
|
var candidate = Path.Combine(candidateBase, "runtime/coreclr");
|
2015-11-21 03:00:56 +00:00
|
|
|
|
if (File.Exists(Path.Combine(candidate, Constants.LibCoreClrName)))
|
|
|
|
|
{
|
2016-02-02 23:26:23 +00:00
|
|
|
|
dotnetHome = Path.GetFullPath(candidateBase);
|
2015-11-21 03:00:56 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-22 22:04:04 +00:00
|
|
|
|
result = Command.Create(outputName, _args)
|
2015-11-21 03:00:56 +00:00
|
|
|
|
.ForwardStdOut()
|
|
|
|
|
.ForwardStdErr()
|
2016-02-02 23:26:23 +00:00
|
|
|
|
.EnvironmentVariable("DOTNET_HOME", dotnetHome)
|
2016-02-03 20:04:09 +00:00
|
|
|
|
.Execute()
|
|
|
|
|
.ExitCode;
|
2015-12-14 06:40:11 +00:00
|
|
|
|
|
2016-02-03 20:04:09 +00:00
|
|
|
|
return result;
|
2015-11-21 03:00:56 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static int RunInteractive(string scriptName)
|
|
|
|
|
{
|
2016-01-31 05:47:50 +00:00
|
|
|
|
var command = Command.CreateDotNet($"repl-csi", new [] {scriptName})
|
2015-11-21 03:00:56 +00:00
|
|
|
|
.ForwardStdOut()
|
|
|
|
|
.ForwardStdErr();
|
|
|
|
|
var result = command.Execute();
|
|
|
|
|
return result.ExitCode;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|