diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 64f1e6b4..1072bdeb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,11 +9,11 @@ jobs: steps: - uses: actions/checkout@v3 - name: Install .Net Core - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: | - 6.0.x - 7.0.x + 8.0.x + 9.0.x include-prerelease: true - name: Install dotnet-script run: dotnet tool install dotnet-script --global @@ -22,16 +22,16 @@ jobs: run: dotnet-script build/Build.csx build-mac: - runs-on: macos-latest + runs-on: macos-13 steps: - uses: actions/checkout@v3 - name: Install .Net Core - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: | - 6.0.x - 7.0.x + 8.0.x + 9.0.x include-prerelease: true - name: Install dotnet-script run: dotnet tool install dotnet-script --global @@ -45,11 +45,11 @@ jobs: steps: - uses: actions/checkout@v3 - name: Install .Net Core - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: | - 6.0.x - 7.0.x + 8.0.x + 9.0.x include-prerelease: true - name: Install dotnet-script run: dotnet tool install dotnet-script --global diff --git a/.gitignore b/.gitignore index 860e9507..62f574c6 100644 --- a/.gitignore +++ b/.gitignore @@ -266,3 +266,4 @@ project.json /dotnet-script /.vscode /src/Dotnet.Script/Properties/launchSettings.json +.DS_Store diff --git a/README.md b/README.md index 27e2cc13..3482c176 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,22 @@ Run C# scripts from the .NET CLI, define NuGet packages inline and edit/debug th ## NuGet Packages -| Name | Version | Framework(s) | -| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | -| `dotnet-script` (global tool) | [![Nuget](http://img.shields.io/nuget/v/dotnet-script.svg?maxAge=10800)](https://www.nuget.org/packages/dotnet-script/) | `net6.0`, `net7.0` | -| `Dotnet.Script` (CLI as Nuget) | [![Nuget](http://img.shields.io/nuget/v/dotnet.script.svg?maxAge=10800)](https://www.nuget.org/packages/dotnet.script/) | `net6.0`, `net7.0` | -| `Dotnet.Script.Core` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.Core.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.Core/) | `net6.0` , `netstandard2.0` | -| `Dotnet.Script.DependencyModel` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.DependencyModel.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.DependencyModel/) | `netstandard2.0` | -| `Dotnet.Script.DependencyModel.Nuget` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.DependencyModel.Nuget.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.DependencyModel.Nuget/) | `netstandard2.0` | +| Name | Version | Framework(s) | +| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | +| `dotnet-script` (global tool) | [![Nuget](http://img.shields.io/nuget/v/dotnet-script.svg?maxAge=10800)](https://www.nuget.org/packages/dotnet-script/) | `net8.0`,`net9.0` | +| `Dotnet.Script` (CLI as Nuget) | [![Nuget](http://img.shields.io/nuget/v/dotnet.script.svg?maxAge=10800)](https://www.nuget.org/packages/dotnet.script/) | `net8.0`,`net9.0` | +| `Dotnet.Script.Core` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.Core.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.Core/) | `net8.0`,`net9.0`,`netstandard2.0` | +| `Dotnet.Script.DependencyModel` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.DependencyModel.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.DependencyModel/) | `netstandard2.0` | +| `Dotnet.Script.DependencyModel.Nuget` | [![Nuget](http://img.shields.io/nuget/v/Dotnet.Script.DependencyModel.Nuget.svg?maxAge=10800)](https://www.nuget.org/packages/Dotnet.Script.DependencyModel.Nuget/) | `netstandard2.0` | ## Installing ### Prerequisites -The only thing we need to install is [.Net 6.0 or .Net 7.0](https://www.microsoft.com/net/download/core). +The only thing we need to install is [.NET 8.0 or .NET 9.0 SDK](https://dotnet.microsoft.com/en-us/download/dotnet). + +[Note](https://learn.microsoft.com/en-us/dotnet/core/install/linux-scripted-manual#manual-install): +> If you install the .NET SDK to a non-default location, you need to set the environment variable `DOTNET_ROOT` to the directory that contains the dotnet executable ### .NET Core Global Tool @@ -103,6 +106,19 @@ That is all it takes and we can execute the script. Args are accessible via the dotnet script helloworld.csx ``` +The following namespaces are available in the script implicitly and do not need to be imported explicitly: + + - System + - System.IO + - System.Collections.Generic + - System.Console + - System.Diagnostics + - System.Dynamic + - System.Linq + - System.Linq.Expressions + - System.Text + - System.Threading.Tasks + ### Scaffolding Simply create a folder somewhere on your system and issue the following command. @@ -591,3 +607,4 @@ a.Run(); ## License [MIT License](https://github.com/dotnet-script/dotnet-script/blob/master/LICENSE) + - diff --git a/build/Build.csx b/build/Build.csx index 684f6602..3aa8a709 100644 --- a/build/Build.csx +++ b/build/Build.csx @@ -1,4 +1,4 @@ -#load "nuget:Dotnet.Build, 0.7.1" +#load "nuget:Dotnet.Build, 0.23.0" #load "nuget:dotnet-steps, 0.0.1" #load "nuget:github-changelog, 0.1.5" #load "BuildContext.csx" @@ -33,7 +33,7 @@ await StepRunner.Execute(Args); private void CreateGitHubReleaseAsset() { - DotNet.Publish(dotnetScriptProjectFolder, publishArtifactsFolder, "net6.0"); + DotNet.Publish(dotnetScriptProjectFolder, publishArtifactsFolder, "net8.0"); Zip(publishArchiveFolder, pathToGitHubReleaseAsset); } @@ -58,7 +58,8 @@ private void CreateNuGetPackages() private void RunTests() { - DotNet.Test(testProjectFolder); + Command.Execute("dotnet", "test -c Release -f net8.0", testProjectFolder); + Command.Execute("dotnet", "test -c Release -f net9.0", testProjectFolder); if (BuildEnvironment.IsWindows) { DotNet.Test(testDesktopProjectFolder); @@ -86,7 +87,8 @@ private async Task PublishRelease() Git.Default.RequireCleanWorkingTree(); await ReleaseManagerFor(owner, projectName, BuildEnvironment.GitHubAccessToken) .CreateRelease(Git.Default.GetLatestTag(), pathToReleaseNotes, new[] { new ZipReleaseAsset(pathToGitHubReleaseAsset) }); - NuGet.TryPush(nuGetArtifactsFolder); + + DotNet.TryPush(nuGetArtifactsFolder); } } diff --git a/build/BuildContext.csx b/build/BuildContext.csx index 6cf4505b..1cfeeb07 100644 --- a/build/BuildContext.csx +++ b/build/BuildContext.csx @@ -1,4 +1,4 @@ -#load "nuget:Dotnet.Build, 0.7.1" +#load "nuget:Dotnet.Build, 0.23.0" using static FileUtils; using System.Xml.Linq; @@ -7,7 +7,7 @@ const string GlobalToolPackageId = "dotnet-script"; var owner = "filipw"; var projectName = "dotnet-script"; var root = FileUtils.GetScriptFolder(); -var solutionFolder = Path.Combine(root,"..","src"); +var solutionFolder = Path.Combine(root, "..", "src"); var dotnetScriptProjectFolder = Path.Combine(root, "..", "src", "Dotnet.Script"); var dotnetScriptCoreProjectFolder = Path.Combine(root, "..", "src", "Dotnet.Script.Core"); var dotnetScriptDependencyModelProjectFolder = Path.Combine(root, "..", "src", "Dotnet.Script.DependencyModel"); diff --git a/build/omnisharp.json b/build/omnisharp.json index 74b7fc1b..945a3c21 100644 --- a/build/omnisharp.json +++ b/build/omnisharp.json @@ -1,6 +1,6 @@ { "script": { "enableScriptNuGetReferences": true, - "defaultTargetFramework": "net6.0" + "defaultTargetFramework": "net8.0" } } \ No newline at end of file diff --git a/build/prerestore.Dockerfile b/build/prerestore.Dockerfile index 4bca3c56..48894424 100644 --- a/build/prerestore.Dockerfile +++ b/build/prerestore.Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:5.0 +FROM mcr.microsoft.com/dotnet/sdk:7.0 # https://www.nuget.org/packages/dotnet-script/ RUN dotnet tool install dotnet-script --tool-path /usr/bin @@ -10,4 +10,4 @@ RUN dotnet tool install dotnet-script --tool-path /usr/bin # docker container. RUN dotnet script eval "Console.WriteLine(\"☑️ Prepared env for offline usage\")" -ENTRYPOINT [ "dotnet", "script" ] \ No newline at end of file +ENTRYPOINT [ "dotnet", "script" ] diff --git a/global.json b/global.json index d4d08251..97614a3d 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "7.0.100", + "version": "9.0.100", "rollForward": "latestFeature" } } diff --git a/omnisharp.json b/omnisharp.json index 93c5d8d9..973aa4c7 100644 --- a/omnisharp.json +++ b/omnisharp.json @@ -8,7 +8,7 @@ }, "script": { "enableScriptNuGetReferences": true, - "defaultTargetFramework": "net5.0" + "defaultTargetFramework": "net6.0" }, "FormattingOptions": { "organizeImports": true, diff --git a/src/.vscode/tasks.json b/src/.vscode/tasks.json index e35e8bda..d778ce8d 100644 --- a/src/.vscode/tasks.json +++ b/src/.vscode/tasks.json @@ -46,7 +46,7 @@ "-c", "release", "-f", - "net7.0", + "net9.0", "${workspaceFolder}/Dotnet.Script.Tests/DotNet.Script.Tests.csproj" ], "problemMatcher": "$msCompile", diff --git a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs index 4b3b176a..0712495a 100644 --- a/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs +++ b/src/Dotnet.Script.Core/Commands/ExecuteScriptCommand.cs @@ -31,7 +31,7 @@ public async Task Run(ExecuteScriptCommandOptions optio return await DownloadAndRunCode(options); } - var pathToLibrary = GetLibrary(options); + var pathToLibrary = GetLibrary(options); var libraryOptions = new ExecuteLibraryCommandOptions(pathToLibrary, options.Arguments, options.NoCache) { @@ -50,7 +50,7 @@ private async Task DownloadAndRunCode(ExecuteScriptCommandOpti return await new ExecuteCodeCommand(_scriptConsole, _logFactory).Execute(options); } - private string GetLibrary(ExecuteScriptCommandOptions executeOptions) + private string GetLibrary(ExecuteScriptCommandOptions executeOptions) { var projectFolder = FileUtils.GetPathToScriptTempFolder(executeOptions.File.Path); var executionCacheFolder = Path.Combine(projectFolder, "execution-cache"); @@ -70,7 +70,7 @@ private string GetLibrary(ExecuteScriptCommandOptions executeOptions) AssemblyLoadContext = executeOptions.AssemblyLoadContext #endif }; - new PublishCommand(_scriptConsole, _logFactory).Execute(options); + new PublishCommand(_scriptConsole, _logFactory).Execute(options); if (hash != null) { File.WriteAllText(Path.Combine(executionCacheFolder, "script.sha256"), hash); diff --git a/src/Dotnet.Script.Core/Commands/PublishCommand.cs b/src/Dotnet.Script.Core/Commands/PublishCommand.cs index 7e5311eb..08a09ffb 100644 --- a/src/Dotnet.Script.Core/Commands/PublishCommand.cs +++ b/src/Dotnet.Script.Core/Commands/PublishCommand.cs @@ -18,6 +18,11 @@ public PublishCommand(ScriptConsole scriptConsole, LogFactory logFactory) } public void Execute(PublishCommandOptions options) + { + Execute(options); + } + + public void Execute(PublishCommandOptions options) { var absoluteFilePath = options.File.Path; @@ -41,11 +46,11 @@ public void Execute(PublishCommandOptions options) if (options.PublishType == PublishType.Library) { - publisher.CreateAssembly(context, _logFactory, options.LibraryName); + publisher.CreateAssembly(context, _logFactory, options.LibraryName); } else { - publisher.CreateExecutable(context, _logFactory, options.RuntimeIdentifier, options.LibraryName); + publisher.CreateExecutable(context, _logFactory, options.RuntimeIdentifier, options.LibraryName); } } } diff --git a/src/Dotnet.Script.Core/Dotnet.Script.Core.csproj b/src/Dotnet.Script.Core/Dotnet.Script.Core.csproj index 094312d6..94dd6e45 100644 --- a/src/Dotnet.Script.Core/Dotnet.Script.Core.csproj +++ b/src/Dotnet.Script.Core/Dotnet.Script.Core.csproj @@ -2,9 +2,9 @@ A cross platform library allowing you to run C# (CSX) scripts with support for debugging and inline NuGet packages. Based on Roslyn. - 1.4.0 + 1.6.0 filipw - net6.0;netstandard2.0 + net9.0;net8.0;netstandard2.0 Dotnet.Script.Core Dotnet.Script.Core script;csx;csharp;roslyn @@ -24,18 +24,18 @@ - - - + + + - + - + \ No newline at end of file diff --git a/src/Dotnet.Script.Core/Interactive/InteractiveRunner.cs b/src/Dotnet.Script.Core/Interactive/InteractiveRunner.cs index 99473fd5..4ffcecf4 100644 --- a/src/Dotnet.Script.Core/Interactive/InteractiveRunner.cs +++ b/src/Dotnet.Script.Core/Interactive/InteractiveRunner.cs @@ -26,7 +26,7 @@ public class InteractiveRunner protected ScriptCompiler ScriptCompiler; protected ScriptConsole Console; private readonly string[] _packageSources; - protected CSharpParseOptions ParseOptions = new CSharpParseOptions(LanguageVersion.Latest, kind: SourceCodeKind.Script); + protected CSharpParseOptions ParseOptions = new CSharpParseOptions(LanguageVersion.Preview, kind: SourceCodeKind.Script); protected InteractiveCommandProvider InteractiveCommandParser = new InteractiveCommandProvider(); protected string CurrentDirectory = Directory.GetCurrentDirectory(); diff --git a/src/Dotnet.Script.Core/Internal/PreprocessorLineRewriter.cs b/src/Dotnet.Script.Core/Internal/PreprocessorLineRewriter.cs index a6658ab8..e2d88866 100644 --- a/src/Dotnet.Script.Core/Internal/PreprocessorLineRewriter.cs +++ b/src/Dotnet.Script.Core/Internal/PreprocessorLineRewriter.cs @@ -25,10 +25,10 @@ public override SyntaxNode VisitReferenceDirectiveTrivia(ReferenceDirectiveTrivi private static SyntaxNode HandleSkippedTrivia(SyntaxNode node) { var skippedTrivia = node.DescendantTrivia().Where(x => x.RawKind == (int)SyntaxKind.SkippedTokensTrivia).FirstOrDefault(); - if (skippedTrivia.Token.Kind() != SyntaxKind.None) + if (!skippedTrivia.Token.IsKind(SyntaxKind.None)) { var firstToken = skippedTrivia.GetStructure().ChildTokens().FirstOrDefault(); - if (firstToken.Kind() == SyntaxKind.BadToken && firstToken.ToFullString().Trim() == ";") + if (firstToken.IsKind(SyntaxKind.BadToken) && firstToken.ToFullString().Trim() == ";") { node = node.ReplaceToken(firstToken, SyntaxFactory.Token(SyntaxKind.None)); skippedTrivia = node.DescendantTrivia().Where(x => x.RawKind == (int)SyntaxKind.SkippedTokensTrivia).FirstOrDefault(); diff --git a/src/Dotnet.Script.Core/Scaffolder.cs b/src/Dotnet.Script.Core/Scaffolder.cs index b07e911e..8e52acc1 100644 --- a/src/Dotnet.Script.Core/Scaffolder.cs +++ b/src/Dotnet.Script.Core/Scaffolder.cs @@ -81,6 +81,7 @@ public void RegisterFileHandler() if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // register dotnet-script as the tool to process .csx files + _commandRunner.Execute("reg", @"delete HKCU\Software\classes\.csx /f"); _commandRunner.Execute("reg", @"add HKCU\Software\classes\.csx /f /ve /t REG_SZ /d dotnetscript"); _commandRunner.Execute("reg", $@"add HKCU\Software\Classes\dotnetscript\Shell\Open\Command /f /ve /t REG_EXPAND_SZ /d ""\""%ProgramFiles%\dotnet\dotnet.exe\"" script \""%1\"" -- %*"""); } @@ -141,7 +142,7 @@ private void CreateLaunchConfiguration(string currentWorkingDirectory) _scriptConsole.WriteNormal("Creating VS Code launch configuration file"); string pathToLaunchFile = Path.Combine(vsCodeDirectory, "launch.json"); string installLocation = _scriptEnvironment.InstallLocation; - bool isInstalledAsGlobalTool = installLocation.Contains(".dotnet/tools", StringComparison.OrdinalIgnoreCase); + bool isInstalledAsGlobalTool = installLocation.Contains($".dotnet{Path.DirectorySeparatorChar}tools", StringComparison.OrdinalIgnoreCase); string dotnetScriptPath = Path.Combine(installLocation, "dotnet-script.dll").Replace(@"\", "/"); string launchFileContent; if (!File.Exists(pathToLaunchFile)) diff --git a/src/Dotnet.Script.Core/ScriptPublisher.cs b/src/Dotnet.Script.Core/ScriptPublisher.cs index 78b51f1d..faaf6b05 100644 --- a/src/Dotnet.Script.Core/ScriptPublisher.cs +++ b/src/Dotnet.Script.Core/ScriptPublisher.cs @@ -11,7 +11,7 @@ namespace Dotnet.Script.Core { public class ScriptPublisher { - private const string ScriptingVersion = "4.4.0-1.final"; + private const string ScriptingVersion = "4.11.0"; private readonly ScriptProjectProvider _scriptProjectProvider; private readonly ScriptEmitter _scriptEmitter; @@ -57,7 +57,7 @@ public void CreateAssembly(ScriptContext context, LogFactory log // only display published if we aren't auto publishing to temp folder if (!scriptAssemblyPath.StartsWith(FileUtils.GetTempPath())) { - _scriptConsole.WriteSuccess($"Published {context.FilePath} to { scriptAssemblyPath}"); + _scriptConsole.WriteSuccess($"Published {context.FilePath} to {scriptAssemblyPath}"); } } diff --git a/src/Dotnet.Script.DependencyModel.Nuget/Dotnet.Script.DependencyModel.NuGet.csproj b/src/Dotnet.Script.DependencyModel.Nuget/Dotnet.Script.DependencyModel.NuGet.csproj index 448dae7f..c2794916 100644 --- a/src/Dotnet.Script.DependencyModel.Nuget/Dotnet.Script.DependencyModel.NuGet.csproj +++ b/src/Dotnet.Script.DependencyModel.Nuget/Dotnet.Script.DependencyModel.NuGet.csproj @@ -1,5 +1,5 @@ - - + + netstandard2.0 MIT @@ -8,7 +8,7 @@ https://github.com/dotnet-script/dotnet-script.git git script;csx;csharp;roslyn;nuget - 1.4.0 + 1.6.0 A MetadataReferenceResolver that allows inline nuget references to be specified in script(csx) files. dotnet-script dotnet-script @@ -16,11 +16,10 @@ true ../dotnet-script.snk - - + - + \ No newline at end of file diff --git a/src/Dotnet.Script.DependencyModel/Dotnet.Script.DependencyModel.csproj b/src/Dotnet.Script.DependencyModel/Dotnet.Script.DependencyModel.csproj index 2d228cf5..a0be1fb6 100644 --- a/src/Dotnet.Script.DependencyModel/Dotnet.Script.DependencyModel.csproj +++ b/src/Dotnet.Script.DependencyModel/Dotnet.Script.DependencyModel.csproj @@ -1,5 +1,5 @@ - - + + netstandard2.0 dotnet-script @@ -11,29 +11,24 @@ https://github.com/dotnet-script/dotnet-script.git git script;csx;csharp;roslyn;omnisharp - 1.4.0 + 1.6.0 latest true ../dotnet-script.snk - - ScriptParser.cs - - - + - - + \ No newline at end of file diff --git a/src/Dotnet.Script.DependencyModel/Environment/ScriptEnvironment.cs b/src/Dotnet.Script.DependencyModel/Environment/ScriptEnvironment.cs index afb6591e..2b6de442 100644 --- a/src/Dotnet.Script.DependencyModel/Environment/ScriptEnvironment.cs +++ b/src/Dotnet.Script.DependencyModel/Environment/ScriptEnvironment.cs @@ -133,10 +133,16 @@ private static string GetProcessArchitecture() private static string GetRuntimeIdentifier() { var platformIdentifier = GetPlatformIdentifier(); + +#if NET8_0 + return $"{platformIdentifier}-{GetProcessArchitecture()}"; +#endif + if (platformIdentifier == "osx" || platformIdentifier == "linux") { return $"{platformIdentifier}-{GetProcessArchitecture()}"; } + var runtimeIdentifier = RuntimeEnvironment.GetRuntimeIdentifier(); return runtimeIdentifier; } diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/FileUtils.cs b/src/Dotnet.Script.DependencyModel/ProjectSystem/FileUtils.cs index aa52c14a..b23a0d1a 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/FileUtils.cs +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/FileUtils.cs @@ -1,9 +1,9 @@ -using Dotnet.Script.DependencyModel.Environment; -using System; +using System; using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; using System.Text; +using Dotnet.Script.DependencyModel.Environment; using SysEnvironment = System.Environment; namespace Dotnet.Script.DependencyModel.ProjectSystem @@ -51,8 +51,14 @@ public static string GetTempPath() { // prefer the custom env variable if set var cachePath = SysEnvironment.GetEnvironmentVariable("DOTNET_SCRIPT_CACHE_LOCATION"); + if (!string.IsNullOrEmpty(cachePath)) { + // if the path is not absolute, make it relative to the current folder + if (!Path.IsPathRooted(cachePath)) + { + cachePath = Path.Combine(Directory.GetCurrentDirectory(), cachePath); + } return cachePath; } diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptFilesResolver.cs b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptFilesResolver.cs index 16d2119d..740acbad 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptFilesResolver.cs +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptFilesResolver.cs @@ -61,7 +61,7 @@ private void Process(string csxFile, HashSet result) private static string[] GetLoadDirectives(string content) { - var matches = Regex.Matches(content, @"^\s*#load\s*""\s*(.+)\s*""", RegexOptions.Multiline); + var matches = Regex.Matches(content, @"^\s*#load\s*""\s*(.+?)\s*""", RegexOptions.Multiline); List result = new List(); foreach (var match in matches.Cast()) { diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptParser.cs b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptParser.cs index 0d058a21..9222a220 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptParser.cs +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/ScriptParser.cs @@ -53,7 +53,7 @@ public ParseResult ParseFromFiles(IEnumerable csxFiles) private static string ReadSdkFromReferenceDirective(string fileContent) { const string pattern = DirectivePatternPrefix + "r" + SdkDirectivePatternSuffix; - var match = Regex.Match(fileContent, pattern); + var match = Regex.Match(fileContent, pattern, RegexOptions.Multiline); if (match.Success) { var sdk = match.Groups[1].Value; diff --git a/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template b/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template index 43ef3971..8bfbcffb 100644 --- a/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template +++ b/src/Dotnet.Script.DependencyModel/ProjectSystem/csproj.template @@ -3,6 +3,7 @@ Exe net5.0 latest + true diff --git a/src/Dotnet.Script.Desktop.Tests/Dotnet.Script.Desktop.Tests.csproj b/src/Dotnet.Script.Desktop.Tests/Dotnet.Script.Desktop.Tests.csproj index cbe23b97..5d609576 100644 --- a/src/Dotnet.Script.Desktop.Tests/Dotnet.Script.Desktop.Tests.csproj +++ b/src/Dotnet.Script.Desktop.Tests/Dotnet.Script.Desktop.Tests.csproj @@ -1,32 +1,29 @@ - - + + net472 true ../dotnet-script.snk - - - + + + all runtime; build; native; contentfiles; analyzers - + - - PreserveNewest - - + \ No newline at end of file diff --git a/src/Dotnet.Script.Extras/Dotnet.Script.Extras.csproj b/src/Dotnet.Script.Extras/Dotnet.Script.Extras.csproj index 19a9fd9b..c79a5f84 100644 --- a/src/Dotnet.Script.Extras/Dotnet.Script.Extras.csproj +++ b/src/Dotnet.Script.Extras/Dotnet.Script.Extras.csproj @@ -1,8 +1,8 @@ - - + + Extensions and add ons to C# scripting - 0.2.0 + 0.3.0 netstandard2.0 Dotnet.Script.Extras Dotnet.Script.Extras @@ -10,10 +10,8 @@ false false - - - + + - - + \ No newline at end of file diff --git a/src/Dotnet.Script.Shared.Tests/Dotnet.Script.Shared.Tests.csproj b/src/Dotnet.Script.Shared.Tests/Dotnet.Script.Shared.Tests.csproj index 2b928e99..2365de7b 100644 --- a/src/Dotnet.Script.Shared.Tests/Dotnet.Script.Shared.Tests.csproj +++ b/src/Dotnet.Script.Shared.Tests/Dotnet.Script.Shared.Tests.csproj @@ -1,18 +1,15 @@ + - netstandard2.0 true ../dotnet-script.snk - - + - - - + \ No newline at end of file diff --git a/src/Dotnet.Script.Tests/Dotnet.Script.Tests.csproj b/src/Dotnet.Script.Tests/Dotnet.Script.Tests.csproj index 0144d8e3..4b8b7da5 100644 --- a/src/Dotnet.Script.Tests/Dotnet.Script.Tests.csproj +++ b/src/Dotnet.Script.Tests/Dotnet.Script.Tests.csproj @@ -1,6 +1,7 @@ + - net7.0;net6.0 + net9.0;net8.0 false true ../dotnet-script.snk @@ -10,14 +11,14 @@ runtime; build; native; contentfiles; analyzers all - - - + + + all runtime; build; native; contentfiles; analyzers - + diff --git a/src/Dotnet.Script.Tests/FileUtilsTests.cs b/src/Dotnet.Script.Tests/FileUtilsTests.cs new file mode 100644 index 00000000..8a2267ab --- /dev/null +++ b/src/Dotnet.Script.Tests/FileUtilsTests.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using Dotnet.Script.DependencyModel.ProjectSystem; +using Xunit; + +namespace Dotnet.Script.Tests +{ + public class FileUtilsTests + { + [Fact] + public void GetTempPathCanBeOverridenWithAbsolutePathViaEnvVar() + { + var path = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); + try + { + Environment.SetEnvironmentVariable("DOTNET_SCRIPT_CACHE_LOCATION", path); + var tempPath = FileUtils.GetTempPath(); + Assert.Equal(path, tempPath); + } + finally + { + Environment.SetEnvironmentVariable("DOTNET_SCRIPT_CACHE_LOCATION", null); + } + } + + [Fact] + public void GetTempPathCanBeOverridenWithRelativePathViaEnvVar() + { + var path = "foo"; + try + { + Environment.SetEnvironmentVariable("DOTNET_SCRIPT_CACHE_LOCATION", path); + var tempPath = FileUtils.GetTempPath(); + Assert.Equal(Path.Combine(Directory.GetCurrentDirectory(), path), tempPath); + } + finally + { + Environment.SetEnvironmentVariable("DOTNET_SCRIPT_CACHE_LOCATION", null); + } + } + } +} diff --git a/src/Dotnet.Script.Tests/InteractiveRunnerTests.cs b/src/Dotnet.Script.Tests/InteractiveRunnerTests.cs index eba5ff06..da5e3b7f 100644 --- a/src/Dotnet.Script.Tests/InteractiveRunnerTests.cs +++ b/src/Dotnet.Script.Tests/InteractiveRunnerTests.cs @@ -19,8 +19,7 @@ public async Task ShouldCompileAndExecuteWithWebSdk() { @"#r ""sdk:Microsoft.NET.Sdk.Web""", "using Microsoft.AspNetCore.Builder;", - "var a = WebApplication.Create();", - @"a.GetType()", + @"typeof(WebApplication)", "#exit" }; diff --git a/src/Dotnet.Script.Tests/NuGetSourceReferenceResolverTests.cs b/src/Dotnet.Script.Tests/NuGetSourceReferenceResolverTests.cs index 20ad3161..82578387 100644 --- a/src/Dotnet.Script.Tests/NuGetSourceReferenceResolverTests.cs +++ b/src/Dotnet.Script.Tests/NuGetSourceReferenceResolverTests.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Collections.Immutable; using System.IO; using System.Text; diff --git a/src/Dotnet.Script.Tests/ScaffoldingTests.cs b/src/Dotnet.Script.Tests/ScaffoldingTests.cs index 6051ac73..8335de59 100644 --- a/src/Dotnet.Script.Tests/ScaffoldingTests.cs +++ b/src/Dotnet.Script.Tests/ScaffoldingTests.cs @@ -179,7 +179,7 @@ public void ShouldUpdatePathToDotnetScript() [Fact] public void ShouldCreateUnifiedLaunchFileWhenInstalledAsGlobalTool() { - Scaffolder scaffolder = CreateTestScaffolder("somefolder/.dotnet/tools/dotnet-script"); + Scaffolder scaffolder = CreateTestScaffolder($"somefolder{Path.DirectorySeparatorChar}.dotnet{Path.DirectorySeparatorChar}tools{Path.DirectorySeparatorChar}dotnet-script"); using var scriptFolder = new DisposableFolder(); scaffolder.InitializerFolder("main.csx", scriptFolder.Path); @@ -191,7 +191,7 @@ public void ShouldCreateUnifiedLaunchFileWhenInstalledAsGlobalTool() public void ShouldUpdateToUnifiedLaunchFileWhenInstalledAsGlobalTool() { Scaffolder scaffolder = CreateTestScaffolder("some-install-folder"); - Scaffolder globalToolScaffolder = CreateTestScaffolder("somefolder/.dotnet/tools/dotnet-script"); + Scaffolder globalToolScaffolder = CreateTestScaffolder($"somefolder{Path.DirectorySeparatorChar}.dotnet{Path.DirectorySeparatorChar}tools{Path.DirectorySeparatorChar}dotnet-script"); using var scriptFolder = new DisposableFolder(); scaffolder.InitializerFolder("main.csx", scriptFolder.Path); var fileContent = File.ReadAllText(Path.Combine(scriptFolder.Path, ".vscode", "launch.json")); diff --git a/src/Dotnet.Script.Tests/ScriptExecutionTests.cs b/src/Dotnet.Script.Tests/ScriptExecutionTests.cs index c8947d33..f42a4a3a 100644 --- a/src/Dotnet.Script.Tests/ScriptExecutionTests.cs +++ b/src/Dotnet.Script.Tests/ScriptExecutionTests.cs @@ -1,5 +1,7 @@ using System; using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; using System.Text; using Dotnet.Script.DependencyModel.Environment; using Dotnet.Script.Shared.Tests; @@ -248,7 +250,9 @@ public void ShouldSupportInlineNugetReferencesWithTrailingSemicoloninEvaluatedCo [Theory] [InlineData("https://gist.githubusercontent.com/seesharper/5d6859509ea8364a1fdf66bbf5b7923d/raw/0a32bac2c3ea807f9379a38e251d93e39c8131cb/HelloWorld.csx", - "Hello World")] + "Hello World")] + [InlineData("http://gist.githubusercontent.com/seesharper/5d6859509ea8364a1fdf66bbf5b7923d/raw/0a32bac2c3ea807f9379a38e251d93e39c8131cb/HelloWorld.csx", + "Hello World")] [InlineData("https://github.com/dotnet-script/dotnet-script/files/5035247/hello.csx.gz", "Hello, world!")] public void ShouldExecuteRemoteScript(string url, string output) @@ -257,14 +261,6 @@ public void ShouldExecuteRemoteScript(string url, string output) Assert.Contains(output, result.Output); } - [Fact] - public void ShouldExecuteRemoteScriptUsingTinyUrl() - { - var url = "https://tinyurl.com/y8cda9zt"; - var (output, _) = ScriptTestRunner.Default.Execute(url); - Assert.Contains("Hello World", output); - } - [Fact] public void ShouldHandleIssue268() { @@ -479,13 +475,34 @@ public void ShouldSetCurrentContextualReflectionContext() Assert.Contains("Dotnet.Script.Core.ScriptAssemblyLoadContext", output); } +#if NET6_0 + [Fact] + public void ShouldCompileAndExecuteWithWebSdk() + { + var processResult = ScriptTestRunner.Default.ExecuteFixture("WebApiNet6", "--no-cache"); + Assert.Equal(0, processResult.ExitCode); + } +#endif + +#if NET7_0 [Fact] public void ShouldCompileAndExecuteWithWebSdk() { var processResult = ScriptTestRunner.Default.ExecuteFixture("WebApi", "--no-cache"); Assert.Equal(0, processResult.ExitCode); } - +#endif + +#if NET8_0 + // .NET 8.0 only works with isolated load context + [Fact] + public void ShouldCompileAndExecuteWithWebSdk() + { + var processResult = ScriptTestRunner.Default.ExecuteFixture("WebApi", "--no-cache"); + Assert.Equal(0, processResult.ExitCode); + } +#endif + [Fact] public void ShouldThrowExceptionWhenSdkIsNotSupported() { @@ -493,6 +510,13 @@ public void ShouldThrowExceptionWhenSdkIsNotSupported() Assert.StartsWith("The sdk 'Unsupported' is not supported", processResult.StandardError); } + [Fact] + public void ShouldRespectEnvironmentExitCodeOfTheScript() + { + var processResult = ScriptTestRunner.Default.ExecuteFixture("EnvironmentExitCode", "--no-cache"); + Assert.Equal(0xA0, processResult.ExitCode); + } + private static string CreateTestScript(string scriptFolder) { string script = @" diff --git a/src/Dotnet.Script.Tests/ScriptFilesResolverTests.cs b/src/Dotnet.Script.Tests/ScriptFilesResolverTests.cs index d7faf92d..4d47e02b 100644 --- a/src/Dotnet.Script.Tests/ScriptFilesResolverTests.cs +++ b/src/Dotnet.Script.Tests/ScriptFilesResolverTests.cs @@ -21,11 +21,15 @@ public void ShouldOnlyResolveRootScript() Assert.Contains(files, f => f.Contains("Foo.csx")); Assert.Contains(files, f => !f.Contains("Bar.csx")); } - [Fact] - public void ShouldResolveLoadedScriptInRootFolder() + + [Theory] + [InlineData("#load \"Bar.csx\"")] + // See: https://github.com/dotnet-script/dotnet-script/issues/720 (1) + [InlineData("#load \"Bar.csx\"\n\n\"Hello world\".Dump();")] + public void ShouldResolveLoadedScriptInRootFolder(string rootScriptContent) { using var rootFolder = new DisposableFolder(); - var rootScript = WriteScript("#load \"Bar.csx\"", rootFolder.Path, "Foo.csx"); + var rootScript = WriteScript(rootScriptContent, rootFolder.Path, "Foo.csx"); WriteScript(string.Empty, rootFolder.Path, "Bar.csx"); var scriptFilesResolver = new ScriptFilesResolver(); diff --git a/src/Dotnet.Script.Tests/ScriptProjectProviderTests.cs b/src/Dotnet.Script.Tests/ScriptProjectProviderTests.cs index 9d87775f..fdc3bc03 100644 --- a/src/Dotnet.Script.Tests/ScriptProjectProviderTests.cs +++ b/src/Dotnet.Script.Tests/ScriptProjectProviderTests.cs @@ -40,5 +40,17 @@ public void ShouldUseSpecifiedSdk() var projectFileInfo = provider.CreateProject(TestPathUtils.GetPathToTestFixtureFolder("WebApi"), _scriptEnvironment.TargetFramework, true); Assert.Equal("Microsoft.NET.Sdk.Web", XDocument.Load(projectFileInfo.Path).Descendants("Project").Single().Attributes("Sdk").Single().Value); } + + // See: https://github.com/dotnet-script/dotnet-script/issues/723 + [Theory] + [InlineData("#!/usr/bin/env dotnet-script\n#r \"sdk:Microsoft.NET.Sdk.Web\"")] + [InlineData("#!/usr/bin/env dotnet-script\n\n#r \"sdk:Microsoft.NET.Sdk.Web\"")] + public void ShouldHandleShebangBeforeSdk(string code) + { + var parser = new ScriptParser(TestOutputHelper.CreateTestLogFactory()); + var result = parser.ParseFromCode(code); + + Assert.Equal("Microsoft.NET.Sdk.Web", result.Sdk); + } } } \ No newline at end of file diff --git a/src/Dotnet.Script.Tests/ScriptPublisherTests.cs b/src/Dotnet.Script.Tests/ScriptPublisherTests.cs index 0f7064ef..80da0361 100644 --- a/src/Dotnet.Script.Tests/ScriptPublisherTests.cs +++ b/src/Dotnet.Script.Tests/ScriptPublisherTests.cs @@ -49,7 +49,11 @@ public void SimplePublishTest() public void SimplePublishTestToDifferentRuntimeId() { using var workspaceFolder = new DisposableFolder(); +#if NET8_0 + var runtimeId = _scriptEnvironment.RuntimeIdentifier == "win-x64" ? "osx-x64" : "win10-x64"; +#else var runtimeId = _scriptEnvironment.RuntimeIdentifier == "win10-x64" ? "osx-x64" : "win10-x64"; +#endif var code = @"WriteLine(""hello world"");"; var mainPath = Path.Combine(workspaceFolder.Path, "main.csx"); File.WriteAllText(mainPath, code); diff --git a/src/Dotnet.Script.Tests/TestFixtures/EnvironmentExitCode/EnvironmentExitCode.csx b/src/Dotnet.Script.Tests/TestFixtures/EnvironmentExitCode/EnvironmentExitCode.csx new file mode 100644 index 00000000..ab8f26d5 --- /dev/null +++ b/src/Dotnet.Script.Tests/TestFixtures/EnvironmentExitCode/EnvironmentExitCode.csx @@ -0,0 +1,2 @@ +Environment.ExitCode = 0xA0; +Console.WriteLine("Hello World"); \ No newline at end of file diff --git a/src/Dotnet.Script.Tests/TestFixtures/WebApi/WebApi.csx b/src/Dotnet.Script.Tests/TestFixtures/WebApi/WebApi.csx index b4b76d41..ff851bad 100644 --- a/src/Dotnet.Script.Tests/TestFixtures/WebApi/WebApi.csx +++ b/src/Dotnet.Script.Tests/TestFixtures/WebApi/WebApi.csx @@ -2,5 +2,7 @@ using Microsoft.AspNetCore.Builder; -var a = WebApplication.Create(); -a.MapGet("/", () => "Hello world"); \ No newline at end of file +var builder = WebApplication.CreateBuilder(); +var app = builder.Build(); + +app.MapGet("/", () => "Hello World!"); \ No newline at end of file diff --git a/src/Dotnet.Script.Tests/TestFixtures/WebApiNet6/WebApiNet6.csx b/src/Dotnet.Script.Tests/TestFixtures/WebApiNet6/WebApiNet6.csx new file mode 100644 index 00000000..b4b76d41 --- /dev/null +++ b/src/Dotnet.Script.Tests/TestFixtures/WebApiNet6/WebApiNet6.csx @@ -0,0 +1,6 @@ +#r "sdk:Microsoft.NET.Sdk.Web" + +using Microsoft.AspNetCore.Builder; + +var a = WebApplication.Create(); +a.MapGet("/", () => "Hello world"); \ No newline at end of file diff --git a/src/Dotnet.Script/Dotnet.Script.csproj b/src/Dotnet.Script/Dotnet.Script.csproj index 10f10c13..e33e4619 100644 --- a/src/Dotnet.Script/Dotnet.Script.csproj +++ b/src/Dotnet.Script/Dotnet.Script.csproj @@ -2,10 +2,10 @@ Dotnet CLI tool allowing you to run C# (CSX) scripts. - 1.4.0 + 1.6.0 filipw Dotnet.Script - net7.0;net6.0 + net9.0;net8.0 portable dotnet-script Exe @@ -25,9 +25,10 @@ ../dotnet-script.snk - - - + + + + diff --git a/src/Dotnet.Script/Program.cs b/src/Dotnet.Script/Program.cs index ff77a012..06edc471 100644 --- a/src/Dotnet.Script/Program.cs +++ b/src/Dotnet.Script/Program.cs @@ -188,7 +188,7 @@ private static int Wain(string[] args) ); var logFactory = CreateLogFactory(verbosity.Value(), debugMode.HasValue()); - new PublishCommand(ScriptConsole.Default, logFactory).Execute(options); + new PublishCommand(ScriptConsole.Default, logFactory).Execute(options); return 0; }); }); @@ -258,7 +258,11 @@ private static int Wain(string[] args) }; var fileCommand = new ExecuteScriptCommand(ScriptConsole.Default, logFactory); - return await fileCommand.Run(fileCommandOptions); + var result = await fileCommand.Run(fileCommandOptions); + if (Environment.ExitCode != 0) return Environment.ExitCode; + + return result; + } else {