From fbcc358b040f49b8f8ab60d50dacd1ecf3cfd471 Mon Sep 17 00:00:00 2001 From: Kevin Schneider Date: Fri, 21 Jul 2023 16:30:38 +0200 Subject: [PATCH] add build project --- FsOboParser.sln | 45 ++++++++++++---- build/BasicTasks.fs | 30 +++++++++++ build/Build.fs | 46 ++++++++++++++++ build/DocumentationTasks.fs | 35 ++++++++++++ build/Helpers.fs | 28 ++++++++++ build/MessagePrompts.fs | 18 +++++++ build/PackageTasks.fs | 64 ++++++++++++++++++++++ build/ProjectInfo.fs | 37 +++++++++++++ build/ReleaseNotesTasks.fs | 29 ++++++++++ build/ReleaseTasks.fs | 85 ++++++++++++++++++++++++++++++ build/TestTasks.fs | 43 +++++++++++++++ build/build.fsproj | 34 ++++++++++++ global.json | 6 +++ src/FsOboParser/FsOboParser.fsproj | 2 +- 14 files changed, 491 insertions(+), 11 deletions(-) create mode 100644 build/BasicTasks.fs create mode 100644 build/Build.fs create mode 100644 build/DocumentationTasks.fs create mode 100644 build/Helpers.fs create mode 100644 build/MessagePrompts.fs create mode 100644 build/PackageTasks.fs create mode 100644 build/ProjectInfo.fs create mode 100644 build/ReleaseNotesTasks.fs create mode 100644 build/ReleaseTasks.fs create mode 100644 build/TestTasks.fs create mode 100644 build/build.fsproj create mode 100644 global.json diff --git a/FsOboParser.sln b/FsOboParser.sln index 9a7ed33..4df6fe8 100644 --- a/FsOboParser.sln +++ b/FsOboParser.sln @@ -3,9 +3,25 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsOboParser", "src\FsOboParser\FsOboParser.fsproj", "{7812F4E0-128E-437C-92CF-84C9F621C459}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{BC99056C-0431-4FBE-8396-DAB1FFFF2A8F}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsOboParser.Tests", "tests\FsOboParser.Tests\FsOboParser.Tests.fsproj", "{AADEED8F-ABA6-4401-978E-B80CBC9589BC}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{A989E8E9-BC2B-4E53-97EC-FE0E9ED342F9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{5FA53C60-C472-4A99-A3F7-8098B4606CBE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "project", "project", "{13CB1D92-20F8-4489-9C1A-F06DDFCF3C37}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + global.json = global.json + LICENSE = LICENSE + README.md = README.md + EndProjectSection +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "build", "build\build.fsproj", "{4A02631E-8D3F-4130-8545-C0B7A7424B90}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FsOboParser", "src\FsOboParser\FsOboParser.fsproj", "{9B04A234-E7AC-4960-99A2-3E1B7B05F32A}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FsOboParser.Tests", "tests\FsOboParser.Tests\FsOboParser.Tests.fsproj", "{0A4EF63F-C659-4AB6-AF88-CB444A98C434}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -13,18 +29,27 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7812F4E0-128E-437C-92CF-84C9F621C459}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7812F4E0-128E-437C-92CF-84C9F621C459}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7812F4E0-128E-437C-92CF-84C9F621C459}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7812F4E0-128E-437C-92CF-84C9F621C459}.Release|Any CPU.Build.0 = Release|Any CPU - {AADEED8F-ABA6-4401-978E-B80CBC9589BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AADEED8F-ABA6-4401-978E-B80CBC9589BC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AADEED8F-ABA6-4401-978E-B80CBC9589BC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AADEED8F-ABA6-4401-978E-B80CBC9589BC}.Release|Any CPU.Build.0 = Release|Any CPU + {4A02631E-8D3F-4130-8545-C0B7A7424B90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A02631E-8D3F-4130-8545-C0B7A7424B90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A02631E-8D3F-4130-8545-C0B7A7424B90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A02631E-8D3F-4130-8545-C0B7A7424B90}.Release|Any CPU.Build.0 = Release|Any CPU + {9B04A234-E7AC-4960-99A2-3E1B7B05F32A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B04A234-E7AC-4960-99A2-3E1B7B05F32A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B04A234-E7AC-4960-99A2-3E1B7B05F32A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B04A234-E7AC-4960-99A2-3E1B7B05F32A}.Release|Any CPU.Build.0 = Release|Any CPU + {0A4EF63F-C659-4AB6-AF88-CB444A98C434}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0A4EF63F-C659-4AB6-AF88-CB444A98C434}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0A4EF63F-C659-4AB6-AF88-CB444A98C434}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0A4EF63F-C659-4AB6-AF88-CB444A98C434}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4A02631E-8D3F-4130-8545-C0B7A7424B90} = {5FA53C60-C472-4A99-A3F7-8098B4606CBE} + {9B04A234-E7AC-4960-99A2-3E1B7B05F32A} = {BC99056C-0431-4FBE-8396-DAB1FFFF2A8F} + {0A4EF63F-C659-4AB6-AF88-CB444A98C434} = {A989E8E9-BC2B-4E53-97EC-FE0E9ED342F9} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {54B9E6DB-7B93-4B11-AF6D-F46EF21F9781} EndGlobalSection diff --git a/build/BasicTasks.fs b/build/BasicTasks.fs new file mode 100644 index 0000000..d7f28ad --- /dev/null +++ b/build/BasicTasks.fs @@ -0,0 +1,30 @@ +module BasicTasks + +open BlackFox.Fake +open Fake.IO +open Fake.DotNet +open Fake.IO.Globbing.Operators + +open ProjectInfo + +let setPrereleaseTag = BuildTask.create "SetPrereleaseTag" [] { + printfn "Please enter pre-release package suffix" + let suffix = System.Console.ReadLine() + prereleaseSuffix <- suffix + prereleaseTag <- (sprintf "%s-%s" release.NugetVersion suffix) + isPrerelease <- true +} + +let clean = BuildTask.create "Clean" [] { + !! "src/**/bin" + ++ "src/**/obj" + ++ "tests/**/bin" + ++ "tests/**/obj" + ++ "pkg" + |> Shell.cleanDirs +} + +let build = BuildTask.create "Build" [clean] { + solutionFile + |> DotNet.build id +} \ No newline at end of file diff --git a/build/Build.fs b/build/Build.fs new file mode 100644 index 0000000..b0150e6 --- /dev/null +++ b/build/Build.fs @@ -0,0 +1,46 @@ +open BlackFox.Fake +open System.IO +open Fake.Core +open Fake.DotNet +open Fake.IO +open Fake.IO.FileSystemOperators +open Fake.IO.Globbing.Operators +open Fake.Tools + +open Helpers + +initializeContext() + +open BasicTasks +open TestTasks +open PackageTasks +open DocumentationTasks +open ReleaseTasks + +/// Full release of nuget package, git tag, and documentation for the stable version. +let _release = + BuildTask.createEmpty + "Release" + [clean; build; runTests; pack; buildDocs; createTag; publishNuget; releaseDocs] + +/// Full release of nuget package, git tag, and documentation for the prerelease version. +let _preRelease = + BuildTask.createEmpty + "PreRelease" + [setPrereleaseTag; clean; build; runTests; packPrerelease; buildDocsPrerelease; createPrereleaseTag; publishNugetPrerelease; prereleaseDocs] + +/// Full release of nuget package for the prerelease version. +let _releaseNoDocs = + BuildTask.createEmpty + "ReleaseNoDocs" + [clean; build; runTests; pack; createTag; publishNuget;] + +/// Full release of nuget package for the prerelease version. +let _preReleaseNoDocs = + BuildTask.createEmpty + "PreReleaseNoDocs" + [setPrereleaseTag; clean; build; runTests; packPrerelease; createPrereleaseTag; publishNugetPrerelease] + +[] +let main args = + runOrDefault build args diff --git a/build/DocumentationTasks.fs b/build/DocumentationTasks.fs new file mode 100644 index 0000000..b3e5f48 --- /dev/null +++ b/build/DocumentationTasks.fs @@ -0,0 +1,35 @@ +module DocumentationTasks + +open Helpers +open ProjectInfo +open BasicTasks + +open BlackFox.Fake + +let buildDocs = BuildTask.create "BuildDocs" [build] { + printfn "building docs with stable version %s" stableVersionTag + runDotNet + (sprintf "fsdocs build --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s" stableVersionTag) + "./" +} + +let buildDocsPrerelease = BuildTask.create "BuildDocsPrerelease" [setPrereleaseTag; build] { + printfn "building docs with prerelease version %s" prereleaseTag + runDotNet + (sprintf "fsdocs build --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s" prereleaseTag) + "./" +} + +let watchDocs = BuildTask.create "WatchDocs" [build] { + printfn "watching docs with stable version %s" stableVersionTag + runDotNet + (sprintf "fsdocs watch --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s" stableVersionTag) + "./" +} + +let watchDocsPrerelease = BuildTask.create "WatchDocsPrerelease" [setPrereleaseTag; build] { + printfn "watching docs with prerelease version %s" prereleaseTag + runDotNet + (sprintf "fsdocs watch --eval --clean --properties Configuration=Release --parameters fsdocs-package-version %s" prereleaseTag) + "./" +} diff --git a/build/Helpers.fs b/build/Helpers.fs new file mode 100644 index 0000000..5dd1ed8 --- /dev/null +++ b/build/Helpers.fs @@ -0,0 +1,28 @@ +module Helpers + +open BlackFox.Fake +open Fake.Core +open Fake.DotNet + +let initializeContext () = + let execContext = Context.FakeExecutionContext.Create false "build.fsx" [ ] + Context.setExecutionContext (Context.RuntimeContext.Fake execContext) + +/// Executes a dotnet command in the given working directory +let runDotNet cmd workingDir = + let result = + DotNet.exec (DotNet.Options.withWorkingDirectory workingDir) cmd "" + if result.ExitCode <> 0 then failwithf "'dotnet %s' failed in %s" cmd workingDir + +let runOrDefault defaultTarget args = + Trace.trace (sprintf "%A" args) + try + match args with + | [| target |] -> Target.runOrDefault target + | arr when args.Length > 1 -> + Target.run 0 (Array.head arr) ( Array.tail arr |> List.ofArray ) + | _ -> BuildTask.runOrDefault defaultTarget + 0 + with e -> + printfn "%A" e + 1 \ No newline at end of file diff --git a/build/MessagePrompts.fs b/build/MessagePrompts.fs new file mode 100644 index 0000000..afa3708 --- /dev/null +++ b/build/MessagePrompts.fs @@ -0,0 +1,18 @@ +module MessagePrompts + +let prompt (msg:string) = + System.Console.Write(msg) + System.Console.ReadLine().Trim() + |> function | "" -> None | s -> Some s + |> Option.map (fun s -> s.Replace ("\"","\\\"")) + +let rec promptYesNo msg = + match prompt (sprintf "%s [Yn]: " msg) with + | Some "Y" | Some "y" -> true + | Some "N" | Some "n" -> false + | _ -> System.Console.WriteLine("Sorry, invalid answer"); promptYesNo msg + +let releaseMsg = """This will stage all uncommitted changes, push them to the origin and bump the release version to the latest number in the RELEASE_NOTES.md file. + Do you want to continue?""" + +let releaseDocsMsg = """This will push the docs to gh-pages. Remember building the docs prior to this. Do you want to continue?""" \ No newline at end of file diff --git a/build/PackageTasks.fs b/build/PackageTasks.fs new file mode 100644 index 0000000..e77d4c4 --- /dev/null +++ b/build/PackageTasks.fs @@ -0,0 +1,64 @@ +module PackageTasks + +open ProjectInfo + +open MessagePrompts +open BasicTasks +open TestTasks + +open BlackFox.Fake +open Fake.Core +open Fake.IO.Globbing.Operators + +open System.Text.RegularExpressions + +/// https://github.com/Freymaurer/Fake.Extensions.Release#release-notes-in-nuget +let private replaceCommitLink input = + let commitLinkPattern = @"\[\[#[a-z0-9]*\]\(.*\)\] " + Regex.Replace(input,commitLinkPattern,"") + +let pack = BuildTask.create "Pack" [clean; build; runTests] { + if promptYesNo (sprintf "creating stable package with version %s OK?" stableVersionTag ) + then + !! "src/**/*.*proj" + -- "src/bin/*" + |> Seq.iter (Fake.DotNet.DotNet.pack (fun p -> + let msBuildParams = + {p.MSBuildParams with + Properties = ([ + "Version",stableVersionTag + "PackageReleaseNotes", (release.Notes |> List.map replaceCommitLink |> String.concat "\r\n" ) + ] @ p.MSBuildParams.Properties) + } + { + p with + MSBuildParams = msBuildParams + OutputPath = Some pkgDir + } + )) + else failwith "aborted" +} + +let packPrerelease = BuildTask.create "PackPrerelease" [setPrereleaseTag; clean; build; runTests] { + if promptYesNo (sprintf "package tag will be %s OK?" prereleaseTag ) + then + !! "src/**/*.*proj" + -- "src/bin/*" + |> Seq.iter (Fake.DotNet.DotNet.pack (fun p -> + let msBuildParams = + {p.MSBuildParams with + Properties = ([ + "Version", prereleaseTag + "PackageReleaseNotes", (release.Notes |> List.map replaceCommitLink |> String.toLines ) + ] @ p.MSBuildParams.Properties) + } + { + p with + VersionSuffix = Some prereleaseSuffix + OutputPath = Some pkgDir + MSBuildParams = msBuildParams + } + )) + else + failwith "aborted" +} \ No newline at end of file diff --git a/build/ProjectInfo.fs b/build/ProjectInfo.fs new file mode 100644 index 0000000..959c3ac --- /dev/null +++ b/build/ProjectInfo.fs @@ -0,0 +1,37 @@ +module ProjectInfo + +open Fake.Core + +let project = "FsOboParser" + +let testProjects = + [ + // add relative paths (from project root) to your testprojects here + ] + +let solutionFile = $"{project}.sln" + +let configuration = "Release" + +let gitOwner = "CSBiology" + +let gitHome = $"https://github.com/{gitOwner}" + +let projectRepo = $"https://github.com/{gitOwner}/{project}" + +let pkgDir = "pkg" + +// Create RELEASE_NOTES.md if not existing. Or "release" would throw an error. +Fake.Extensions.Release.ReleaseNotes.ensure() + +let release = ReleaseNotes.load "RELEASE_NOTES.md" + +let stableVersion = SemVer.parse release.NugetVersion + +let stableVersionTag = (sprintf "%i.%i.%i" stableVersion.Major stableVersion.Minor stableVersion.Patch ) + +let mutable prereleaseSuffix = "" + +let mutable prereleaseTag = "" + +let mutable isPrerelease = false \ No newline at end of file diff --git a/build/ReleaseNotesTasks.fs b/build/ReleaseNotesTasks.fs new file mode 100644 index 0000000..22d3671 --- /dev/null +++ b/build/ReleaseNotesTasks.fs @@ -0,0 +1,29 @@ +module ReleaseNotesTasks + +open Fake.Extensions.Release +open BlackFox.Fake + +/// This might not be necessary, mostly useful for apps which want to display current version as it creates an accessible F# version script from RELEASE_NOTES.md +let createAssemblyVersion = BuildTask.create "createvfs" [] { + AssemblyVersion.create ProjectInfo.project +} + +// https://github.com/Freymaurer/Fake.Extensions.Release#releaseupdate +let updateReleaseNotes = BuildTask.createFn "ReleaseNotes" [] (fun config -> + ReleaseNotes.update(ProjectInfo.gitOwner, ProjectInfo.project, config) +) + + +// https://github.com/Freymaurer/Fake.Extensions.Release#githubdraft +let githubDraft = BuildTask.createFn "GithubDraft" [] (fun config -> + + let body = "We are ready to go for the first release!" + + Github.draft( + ProjectInfo.gitOwner, + ProjectInfo.project, + (Some body), + None, + config + ) +) \ No newline at end of file diff --git a/build/ReleaseTasks.fs b/build/ReleaseTasks.fs new file mode 100644 index 0000000..8748ab7 --- /dev/null +++ b/build/ReleaseTasks.fs @@ -0,0 +1,85 @@ +module ReleaseTasks + +open MessagePrompts +open ProjectInfo +open BasicTasks +open TestTasks +open PackageTasks +open DocumentationTasks + +open BlackFox.Fake +open Fake.Core +open Fake.DotNet +open Fake.Api +open Fake.Tools +open Fake.IO +open Fake.IO.Globbing.Operators + +let createTag = BuildTask.create "CreateTag" [clean; build; runTests; pack] { + if promptYesNo (sprintf "tagging branch with %s OK?" stableVersionTag ) then + Git.Branches.tag "" stableVersionTag + Git.Branches.pushTag "" projectRepo stableVersionTag + else + failwith "aborted" +} + +let createPrereleaseTag = BuildTask.create "CreatePrereleaseTag" [setPrereleaseTag; clean; build; runTests; packPrerelease] { + if promptYesNo (sprintf "tagging branch with %s OK?" prereleaseTag ) then + Git.Branches.tag "" prereleaseTag + Git.Branches.pushTag "" projectRepo prereleaseTag + else + failwith "aborted" +} + + +let publishNuget = BuildTask.create "PublishNuget" [clean; build; runTests; pack] { + let targets = (!! (sprintf "%s/*.*pkg" pkgDir )) + for target in targets do printfn "%A" target + let msg = sprintf "release package with version %s?" stableVersionTag + if promptYesNo msg then + let source = "https://api.nuget.org/v3/index.json" + let apikey = Environment.environVar "NUGET_KEY_CSB" + for artifact in targets do + let result = DotNet.exec id "nuget" (sprintf "push -s %s -k %s %s --skip-duplicate" source apikey artifact) + if not result.OK then failwith "failed to push packages" + else failwith "aborted" +} + +let publishNugetPrerelease = BuildTask.create "PublishNugetPrerelease" [clean; build; runTests; packPrerelease] { + let targets = (!! (sprintf "%s/*.*pkg" pkgDir )) + for target in targets do printfn "%A" target + let msg = sprintf "release package with version %s?" prereleaseTag + if promptYesNo msg then + let source = "https://api.nuget.org/v3/index.json" + let apikey = Environment.environVar "NUGET_KEY_CSB" + for artifact in targets do + let result = DotNet.exec id "nuget" (sprintf "push -s %s -k %s %s --skip-duplicate" source apikey artifact) + if not result.OK then failwith "failed to push packages" + else failwith "aborted" +} + +let releaseDocs = BuildTask.create "ReleaseDocs" [buildDocs] { + let msg = sprintf "release docs for version %s?" stableVersionTag + if promptYesNo msg then + Shell.cleanDir "temp" + Git.CommandHelper.runSimpleGitCommand "." (sprintf "clone %s temp/gh-pages --depth 1 -b gh-pages" projectRepo) |> ignore + Shell.copyRecursive "output" "temp/gh-pages" true |> printfn "%A" + Git.CommandHelper.runSimpleGitCommand "temp/gh-pages" "add ." |> printfn "%s" + let cmd = sprintf """commit -a -m "Update generated documentation for version %s""" stableVersionTag + Git.CommandHelper.runSimpleGitCommand "temp/gh-pages" cmd |> printfn "%s" + Git.Branches.push "temp/gh-pages" + else failwith "aborted" +} + +let prereleaseDocs = BuildTask.create "PrereleaseDocs" [buildDocsPrerelease] { + let msg = sprintf "release docs for version %s?" prereleaseTag + if promptYesNo msg then + Shell.cleanDir "temp" + Git.CommandHelper.runSimpleGitCommand "." (sprintf "clone %s temp/gh-pages --depth 1 -b gh-pages" projectRepo) |> ignore + Shell.copyRecursive "output" "temp/gh-pages" true |> printfn "%A" + Git.CommandHelper.runSimpleGitCommand "temp/gh-pages" "add ." |> printfn "%s" + let cmd = sprintf """commit -a -m "Update generated documentation for version %s""" prereleaseTag + Git.CommandHelper.runSimpleGitCommand "temp/gh-pages" cmd |> printfn "%s" + Git.Branches.push "temp/gh-pages" + else failwith "aborted" +} \ No newline at end of file diff --git a/build/TestTasks.fs b/build/TestTasks.fs new file mode 100644 index 0000000..113f964 --- /dev/null +++ b/build/TestTasks.fs @@ -0,0 +1,43 @@ +module TestTasks + +open BlackFox.Fake +open Fake.DotNet + +open ProjectInfo +open BasicTasks + +let runTests = BuildTask.create "RunTests" [clean; build] { + testProjects + |> Seq.iter (fun testProject -> + Fake.DotNet.DotNet.test(fun testParams -> + { + testParams with + Logger = Some "console;verbosity=detailed" + Configuration = DotNet.BuildConfiguration.fromString configuration + NoBuild = true + } + ) testProject + ) +} + +// to do: use this once we have actual tests +let runTestsWithCodeCov = BuildTask.create "RunTestsWithCodeCov" [clean; build] { + let standardParams = Fake.DotNet.MSBuild.CliArguments.Create () + testProjects + |> Seq.iter(fun testProject -> + Fake.DotNet.DotNet.test(fun testParams -> + { + testParams with + MSBuildParams = { + standardParams with + Properties = [ + "AltCover","true" + "AltCoverCobertura","../../codeCov.xml" + "AltCoverForce","true" + ] + }; + Logger = Some "console;verbosity=detailed" + } + ) testProject + ) +} \ No newline at end of file diff --git a/build/build.fsproj b/build/build.fsproj new file mode 100644 index 0000000..8c83a51 --- /dev/null +++ b/build/build.fsproj @@ -0,0 +1,34 @@ + + + + net6.0 + Exe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/global.json b/global.json new file mode 100644 index 0000000..08fc58c --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "6.0.100", + "rollForward": "latestMinor" + } +} \ No newline at end of file diff --git a/src/FsOboParser/FsOboParser.fsproj b/src/FsOboParser/FsOboParser.fsproj index b013290..74ffa5e 100644 --- a/src/FsOboParser/FsOboParser.fsproj +++ b/src/FsOboParser/FsOboParser.fsproj @@ -1,7 +1,7 @@  - net6.0 + netstandard2.0 true