diff --git a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs index 6bf3809c..5c22b8bc 100644 --- a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs +++ b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs @@ -57,7 +57,7 @@ private string GetLibrary(ExecuteScriptCommandOptions executeOptions) return pathToLibrary; } - var options = new PublishCommandOptions(executeOptions.File, executionCacheFolder, "script", PublishType.Library, executeOptions.OptimizationLevel, executeOptions.PackageSources, null, executeOptions.NoCache); + var options = new PublishCommandOptions(executeOptions.File, executionCacheFolder, "script", PublishType.Library, executeOptions.OptimizationLevel, executeOptions.PackageSources, null, executeOptions.NoCache, executeOptions.SDK); new PublishCommand(_scriptConsole, _logFactory).Execute(options); if (hash != null) { @@ -77,7 +77,7 @@ public bool TryCreateHash(ExecuteScriptCommandOptions options, out string hash) var scriptFilesProvider = new ScriptFilesResolver(); var allScriptFiles = scriptFilesProvider.GetScriptFiles(options.File.Path); - var projectFile = new ScriptProjectProvider(_logFactory).CreateProjectFileFromScriptFiles(ScriptEnvironment.Default.TargetFramework, allScriptFiles.ToArray()); + var projectFile = new ScriptProjectProvider(_logFactory).CreateProjectFileFromScriptFiles(ScriptEnvironment.Default.TargetFramework, allScriptFiles.ToArray(), options.SDK); if (!projectFile.IsCacheable) { @@ -93,6 +93,11 @@ public bool TryCreateHash(ExecuteScriptCommandOptions options, out string hash) incrementalHash.AppendData(File.ReadAllBytes(scriptFile)); } + if (!string.IsNullOrWhiteSpace(options.SDK)) + { + incrementalHash.AppendData(Encoding.UTF8.GetBytes(options.SDK)); + } + var configuration = options.OptimizationLevel.ToString(); incrementalHash.AppendData(Encoding.UTF8.GetBytes(configuration)); diff --git a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommandOptions.cs b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommandOptions.cs index 656cb74d..46834cad 100644 --- a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommandOptions.cs +++ b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommandOptions.cs @@ -4,7 +4,7 @@ namespace Dotnet.Script.Core.Commands { public class ExecuteScriptCommandOptions { - public ExecuteScriptCommandOptions(ScriptFile file, string[] arguments, OptimizationLevel optimizationLevel, string[] packageSources, bool isInteractive ,bool noCache) + public ExecuteScriptCommandOptions(ScriptFile file, string[] arguments, OptimizationLevel optimizationLevel, string[] packageSources, bool isInteractive ,bool noCache, string sdk) { File = file; Arguments = arguments; @@ -12,6 +12,7 @@ public ExecuteScriptCommandOptions(ScriptFile file, string[] arguments, Optimiza PackageSources = packageSources; IsInteractive = isInteractive; NoCache = noCache; + SDK = sdk; } public ScriptFile File { get; } @@ -20,5 +21,6 @@ public ExecuteScriptCommandOptions(ScriptFile file, string[] arguments, Optimiza public string[] PackageSources { get; } public bool IsInteractive { get; } public bool NoCache { get; } + public string SDK { get; } } } \ No newline at end of file diff --git a/src/Dotnet.Script.Core/Commands/PublishCommand.cs b/src/Dotnet.Script.Core/Commands/PublishCommand.cs index 684911c0..5bc27532 100644 --- a/src/Dotnet.Script.Core/Commands/PublishCommand.cs +++ b/src/Dotnet.Script.Core/Commands/PublishCommand.cs @@ -32,7 +32,7 @@ public void Execute(PublishCommandOptions options) var scriptEmitter = new ScriptEmitter(_scriptConsole, compiler); var publisher = new ScriptPublisher(_logFactory, scriptEmitter); var code = absoluteFilePath.ToSourceText(); - var context = new ScriptContext(code, absolutePublishDirectory, Enumerable.Empty(), absoluteFilePath, options.OptimizationLevel, packageSources: options.PackageSources); + var context = new ScriptContext(code, absolutePublishDirectory, Enumerable.Empty(), absoluteFilePath, options.OptimizationLevel, packageSources: options.PackageSources, sdk: options.SDK); if (options.PublishType == PublishType.Library) { diff --git a/src/Dotnet.Script.Core/Commands/PublishCommandOptions.cs b/src/Dotnet.Script.Core/Commands/PublishCommandOptions.cs index a82fa295..78cc1467 100644 --- a/src/Dotnet.Script.Core/Commands/PublishCommandOptions.cs +++ b/src/Dotnet.Script.Core/Commands/PublishCommandOptions.cs @@ -5,7 +5,7 @@ namespace Dotnet.Script.Core.Commands { public class PublishCommandOptions { - public PublishCommandOptions(ScriptFile file, string outputDirectory, string libraryName, PublishType publishType, OptimizationLevel optimizationLevel, string[] packageSources, string runtimeIdentifier, bool noCache) + public PublishCommandOptions(ScriptFile file, string outputDirectory, string libraryName, PublishType publishType, OptimizationLevel optimizationLevel, string[] packageSources, string runtimeIdentifier, bool noCache, string sdk) { File = file; OutputDirectory = outputDirectory; @@ -15,6 +15,7 @@ public PublishCommandOptions(ScriptFile file, string outputDirectory, string lib PackageSources = packageSources; RuntimeIdentifier = runtimeIdentifier ?? ScriptEnvironment.Default.RuntimeIdentifier; NoCache = noCache; + SDK = sdk; } public ScriptFile File { get; } @@ -25,6 +26,7 @@ public PublishCommandOptions(ScriptFile file, string outputDirectory, string lib public string[] PackageSources { get; } public string RuntimeIdentifier { get; } public bool NoCache { get; } + public string SDK { get; } } public enum PublishType diff --git a/src/Dotnet.Script.Core/ScriptCompiler.cs b/src/Dotnet.Script.Core/ScriptCompiler.cs index 994cb39f..7580f686 100644 --- a/src/Dotnet.Script.Core/ScriptCompiler.cs +++ b/src/Dotnet.Script.Core/ScriptCompiler.cs @@ -160,17 +160,10 @@ public virtual ScriptCompilationContext CreateCompilationContext(script, context.Code, loader, scriptOptions, runtimeDependencies, nonSuppressedDiagnostics); } - private RuntimeDependency[] GetRuntimeDependencies(ScriptContext context) - { - if (context.ScriptMode == ScriptMode.Script) - { - return RuntimeDependencyResolver.GetDependencies(context.FilePath, context.PackageSources).ToArray(); - } - else - { - return RuntimeDependencyResolver.GetDependenciesForCode(context.WorkingDirectory, context.ScriptMode, context.PackageSources, context.Code.ToString()).ToArray(); - } - } + private RuntimeDependency[] GetRuntimeDependencies(ScriptContext context) + => context.ScriptMode == ScriptMode.Script + ? RuntimeDependencyResolver.GetDependencies(context.FilePath, context.PackageSources, context.SDK).ToArray() + : RuntimeDependencyResolver.GetDependenciesForCode(context.WorkingDirectory, context.ScriptMode, context.PackageSources, context.Code.ToString()).ToArray(); private ScriptOptions AddScriptReferences(ScriptOptions scriptOptions, Dictionary loadedAssembliesMap, Dictionary scriptDependenciesMap) { diff --git a/src/Dotnet.Script.Core/ScriptContext.cs b/src/Dotnet.Script.Core/ScriptContext.cs index 759f2c51..0828491e 100644 --- a/src/Dotnet.Script.Core/ScriptContext.cs +++ b/src/Dotnet.Script.Core/ScriptContext.cs @@ -10,7 +10,7 @@ namespace Dotnet.Script.Core { public class ScriptContext { - public ScriptContext(SourceText code, string workingDirectory, IEnumerable args, string filePath = null, OptimizationLevel optimizationLevel = OptimizationLevel.Debug, ScriptMode scriptMode = ScriptMode.Script, string[] packageSources = null) + public ScriptContext(SourceText code, string workingDirectory, IEnumerable args, string filePath = null, OptimizationLevel optimizationLevel = OptimizationLevel.Debug, ScriptMode scriptMode = ScriptMode.Script, string[] packageSources = null, string sdk = null) { Code = code; WorkingDirectory = workingDirectory; @@ -19,6 +19,7 @@ public ScriptContext(SourceText code, string workingDirectory, IEnumerable(); + SDK = sdk; } public SourceText Code { get; } @@ -34,5 +35,6 @@ public ScriptContext(SourceText code, string workingDirectory, IEnumerable public string TargetFramework { get; set; } = ScriptEnvironment.Default.TargetFramework; + /// + /// Gets or sets the SDK for this . + /// + public string SDK { get; set; } = "Microsoft.NET.Sdk"; + public void Save(string pathToProjectFile) { var projectFileDocument = XDocument.Parse(ReadTemplate("csproj.template")); + projectFileDocument.Root.Add(new XAttribute("Sdk", SDK)); var itemGroupElement = projectFileDocument.Descendants("ItemGroup").Single(); foreach (var packageReference in PackageReferences) { @@ -83,19 +89,15 @@ public void Save(string pathToProjectFile) var targetFrameworkElement = projectFileDocument.Descendants("TargetFramework").Single(); targetFrameworkElement.Value = TargetFramework; - using (var fileStream = new FileStream(pathToProjectFile, FileMode.Create, FileAccess.Write)) - { - projectFileDocument.Save(fileStream); - } + using var fileStream = new FileStream(pathToProjectFile, FileMode.Create, FileAccess.Write); + projectFileDocument.Save(fileStream); } private static string ReadTemplate(string name) { var resourceStream = typeof(ProjectFile).GetTypeInfo().Assembly.GetManifestResourceStream($"Dotnet.Script.DependencyModel.ProjectSystem.{name}"); - using (var streamReader = new StreamReader(resourceStream)) - { - return streamReader.ReadToEnd(); - } + using var streamReader = new StreamReader(resourceStream); + return streamReader.ReadToEnd(); } /// @@ -105,7 +107,8 @@ public bool Equals(ProjectFile other) if (ReferenceEquals(this, other)) return true; return PackageReferences.SequenceEqual(other.PackageReferences) && AssemblyReferences.SequenceEqual(other.AssemblyReferences) - && TargetFramework.Equals(other.TargetFramework); + && TargetFramework.Equals(other.TargetFramework) + && SDK.Equals(other.SDK); } /// diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptProjectProvider.cs b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptProjectProvider.cs index 6b86b512..7ab5c549 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptProjectProvider.cs +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptProjectProvider.cs @@ -6,6 +6,7 @@ using Dotnet.Script.DependencyModel.Environment; using Dotnet.Script.DependencyModel.Logging; using Dotnet.Script.DependencyModel.Process; +using Newtonsoft.Json; namespace Dotnet.Script.DependencyModel.ProjectSystem { @@ -79,7 +80,7 @@ public ProjectFileInfo CreateProject(string targetDirectory, string defaultTarge return CreateProject(targetDirectory, Directory.GetFiles(targetDirectory, "*.csx", SearchOption.AllDirectories), defaultTargetFramework, enableNuGetScriptReferences); } - public ProjectFileInfo CreateProject(string targetDirectory, IEnumerable scriptFiles, string defaultTargetFramework = "net46", bool enableNuGetScriptReferences = false) + public ProjectFileInfo CreateProject(string targetDirectory, IEnumerable scriptFiles, string defaultTargetFramework = "net46", bool enableNuGetScriptReferences = false, string sdk = null) { if (scriptFiles == null || !scriptFiles.Any()) { @@ -94,19 +95,19 @@ public ProjectFileInfo CreateProject(string targetDirectory, IEnumerable _logger.Debug($"Creating project file for *.csx files found in {targetDirectory} using {defaultTargetFramework} as the default framework."); - return SaveProjectFileFromScriptFiles(targetDirectory, defaultTargetFramework, scriptFiles.ToArray()); + return SaveProjectFileFromScriptFiles(targetDirectory, defaultTargetFramework, scriptFiles.ToArray(), sdk); } - public ProjectFileInfo CreateProjectForScriptFile(string scriptFile) + public ProjectFileInfo CreateProjectForScriptFile(string scriptFile, string sdk) { _logger.Debug($"Creating project file for {scriptFile}"); var scriptFiles = _scriptFilesResolver.GetScriptFiles(scriptFile); - return SaveProjectFileFromScriptFiles(Path.GetDirectoryName(scriptFile), _scriptEnvironment.TargetFramework, scriptFiles.ToArray()); + return SaveProjectFileFromScriptFiles(Path.GetDirectoryName(scriptFile), _scriptEnvironment.TargetFramework, scriptFiles.ToArray(), sdk); } - private ProjectFileInfo SaveProjectFileFromScriptFiles(string targetDirectory, string defaultTargetFramework, string[] csxFiles) + private ProjectFileInfo SaveProjectFileFromScriptFiles(string targetDirectory, string defaultTargetFramework, string[] csxFiles, string sdk) { - ProjectFile projectFile = CreateProjectFileFromScriptFiles(defaultTargetFramework, csxFiles); + ProjectFile projectFile = CreateProjectFileFromScriptFiles(defaultTargetFramework, csxFiles, sdk); var pathToProjectFile = GetPathToProjectFile(targetDirectory, defaultTargetFramework); projectFile.Save(pathToProjectFile); @@ -116,7 +117,7 @@ private ProjectFileInfo SaveProjectFileFromScriptFiles(string targetDirectory, s return new ProjectFileInfo(pathToProjectFile, NuGetUtilities.GetNearestConfigPath(targetDirectory)); } - public ProjectFile CreateProjectFileFromScriptFiles(string defaultTargetFramework, string[] csxFiles) + public ProjectFile CreateProjectFileFromScriptFiles(string defaultTargetFramework, string[] csxFiles, string sdk) { var parseresult = _scriptParser.ParseFromFiles(csxFiles); @@ -128,6 +129,11 @@ public ProjectFile CreateProjectFileFromScriptFiles(string defaultTargetFramewor } projectFile.TargetFramework = defaultTargetFramework; + if (!string.IsNullOrWhiteSpace(sdk)) + { + projectFile.SDK = sdk; + } + return projectFile; } diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template b/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template index 119a3645..4d38b3b9 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template @@ -1,10 +1,11 @@ - + Exe netcoreapp2.1 latest + diff --git a/src/Dotnet.Script.DependencyModel/Runtime/RuntimeDependencyResolver.cs b/src/Dotnet.Script.DependencyModel/Runtime/RuntimeDependencyResolver.cs index 7cc1c86e..940ca627 100644 --- a/src/Dotnet.Script.DependencyModel/Runtime/RuntimeDependencyResolver.cs +++ b/src/Dotnet.Script.DependencyModel/Runtime/RuntimeDependencyResolver.cs @@ -41,9 +41,9 @@ private static IRestorer CreateRestorer(LogFactory logFactory, bool useRestoreCa } } - public IEnumerable GetDependencies(string scriptFile, string[] packageSources) + public IEnumerable GetDependencies(string scriptFile, string[] packageSources, string sdk) { - var projectFileInfo = _scriptProjectProvider.CreateProjectForScriptFile(scriptFile); + var projectFileInfo = _scriptProjectProvider.CreateProjectForScriptFile(scriptFile, sdk); _restorer.Restore(projectFileInfo, packageSources); var pathToAssetsFile = Path.Combine(Path.GetDirectoryName(projectFileInfo.Path), "obj", "project.assets.json"); return GetDependenciesInternal(pathToAssetsFile); diff --git a/src/Dotnet.Script.Tests/ScriptPackagesTests.cs b/src/Dotnet.Script.Tests/ScriptPackagesTests.cs index aeb3bebd..f2f4e9ac 100644 --- a/src/Dotnet.Script.Tests/ScriptPackagesTests.cs +++ b/src/Dotnet.Script.Tests/ScriptPackagesTests.cs @@ -105,7 +105,7 @@ public void ShouldGetScriptFilesFromScriptPackage() var resolver = CreateRuntimeDependencyResolver(); var fixture = GetFullPathToTestFixture("ScriptPackage/WithMainCsx"); var csxFiles = Directory.GetFiles(fixture, "*.csx"); - var dependencies = resolver.GetDependencies(csxFiles.First(), Array.Empty()); + var dependencies = resolver.GetDependencies(csxFiles.First(), Array.Empty(), null); var scriptFiles = dependencies.Single(d => d.Name == "ScriptPackageWithMainCsx").Scripts; Assert.NotEmpty(scriptFiles); } @@ -117,7 +117,7 @@ private static string GetFullPathToTestFixture(string path) } - private RuntimeDependencyResolver CreateRuntimeDependencyResolver() + private static RuntimeDependencyResolver CreateRuntimeDependencyResolver() { var resolver = new RuntimeDependencyResolver(TestOutputHelper.CreateTestLogFactory(), useRestoreCache: false); return resolver; diff --git a/src/Dotnet.Script/Program.cs b/src/Dotnet.Script/Program.cs index 54b2c196..2a67d91f 100644 --- a/src/Dotnet.Script/Program.cs +++ b/src/Dotnet.Script/Program.cs @@ -67,6 +67,7 @@ private static int Wain(string[] args) var verbosity = app.Option("--verbosity", " Set the verbosity level of the command. Allowed values are t[trace], d[ebug], i[nfo], w[arning], e[rror], and c[ritical].", CommandOptionType.SingleValue); var nocache = app.Option("--no-cache", "Disable caching (Restore and Dll cache)", CommandOptionType.NoValue); var infoOption = app.Option("--info", "Displays environmental information", CommandOptionType.NoValue); + var sdk = app.Option("--sdk ", "Project SDK to use. Default is \"Microsoft.NET.Sdk\"", CommandOptionType.SingleValue); var argsBeforeDoubleHyphen = args.TakeWhile(a => a != "--").ToArray(); var argsAfterDoubleHyphen = args.SkipWhile(a => a != "--").Skip(1).ToArray(); @@ -181,7 +182,8 @@ private static int Wain(string[] args) commandConfig.ValueEquals("release", StringComparison.OrdinalIgnoreCase) ? OptimizationLevel.Release : OptimizationLevel.Debug, packageSources.Values?.ToArray(), runtime.Value() ?? ScriptEnvironment.Default.RuntimeIdentifier, - nocache.HasValue() + nocache.HasValue(), + sdk.Value() ); var logFactory = CreateLogFactory(verbosity.Value(), debugMode.HasValue()); @@ -244,7 +246,8 @@ private static int Wain(string[] args) optimizationLevel, packageSources.Values?.ToArray(), interactive.HasValue(), - nocache.HasValue() + nocache.HasValue(), + sdk.Value() ); var fileCommand = new ExecuteScriptCommand(ScriptConsole.Default, logFactory);