@re-shell/cli
Version:
Full-stack development platform uniting microservices and microfrontends. Build complete applications with .NET (ASP.NET Core Web API, Minimal API), Java (Spring Boot, Quarkus, Micronaut, Vert.x), Rust (Actix-Web, Warp, Rocket, Axum), Python (FastAPI, Dja
1,631 lines (1,416 loc) • 38.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fsharpPaketTemplate = void 0;
exports.fsharpPaketTemplate = {
id: 'fsharp-paket',
name: 'fsharp-paket',
displayName: 'F# Paket Dependency Manager',
description: 'Modern dependency manager for F# and .NET projects with precise dependency resolution and reproducible builds',
framework: 'paket',
language: 'fsharp',
version: '8.0',
author: 'Re-Shell Team',
featured: true,
recommended: true,
icon: '📦',
type: 'build-system',
complexity: 'intermediate',
keywords: ['fsharp', 'paket', 'dependency', 'package-manager', 'build', 'dotnet'],
features: [
'Precise dependency resolution',
'Reproducible builds',
'Lock file support',
'Group-based dependencies',
'Framework restrictions',
'Source code dependencies',
'Git dependencies',
'NuGet package management',
'Dependency groups',
'Version constraints',
'Transitive dependency control',
'Integration with MSBuild',
'Cross-platform support',
'Dependency analysis'
],
structure: {
'paket.dependencies': `// Paket dependency specification file
// Framework restrictions and source specifications
framework: net6.0, netstandard2.0
// Main NuGet source
source https://api.nuget.org/v3/index.json
// Package dependencies
nuget FSharp.Core >= 6.0.0
nuget Newtonsoft.Json >= 13.0.0
nuget Microsoft.AspNetCore.App >= 6.0.0
// Web framework dependencies
group Web
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget Giraffe >= 6.0.0
nuget Saturn >= 0.16.0
nuget Suave >= 2.6.0
nuget Microsoft.AspNetCore.Authentication.JwtBearer >= 6.0.0
nuget Microsoft.EntityFrameworkCore >= 6.0.0
nuget Microsoft.EntityFrameworkCore.Sqlite >= 6.0.0
// Testing dependencies
group Test
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget Expecto >= 10.0.0
nuget FsCheck >= 2.16.0
nuget Microsoft.NET.Test.Sdk >= 17.0.0
nuget NUnit >= 3.13.0
nuget NUnit3TestAdapter >= 4.0.0
// Build and development tools
group Build
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget FAKE.Core.Target >= 5.23.0
nuget FAKE.IO.FileSystem >= 5.23.0
nuget FAKE.DotNet.Cli >= 5.23.0
nuget FAKE.DotNet.MSBuild >= 5.23.0
nuget FAKE.DotNet.Testing.Expecto >= 5.23.0
// Documentation tools
group Docs
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget FSharp.Formatting >= 14.0.0
nuget FSharp.Compiler.Service >= 41.0.0
// Performance and profiling
group Performance
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget BenchmarkDotNet >= 0.13.0
nuget BenchmarkDotNet.Diagnostics.Windows
nuget Microsoft.Diagnostics.Tracing.TraceEvent >= 3.0.0
// Source code dependencies from GitHub
github fsprojects/FSharpx.Collections src/FSharpx.Collections/Collections.fs
github fsharp/FAKE modules/Octokit/Octokit.fsx
// HTTP file dependency
http https://raw.githubusercontent.com/fsprojects/Paket/master/src/Paket.Core/AssemblyInfo.fs src/AssemblyInfo.fs
// Git dependencies
git https://github.com/fsprojects/FSharp.Data.git master src/FSharp.Data/
git https://github.com/fsprojects/Argu.git 6.0.0 src/Argu/
// Copy local settings
copy_local: false
copy_content_to_output_dir: never
import_targets: false
// Dependency restrictions
restrictions: >= net6.0
content: none
storage: none`,
'paket.lock': `RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
FSharp.Core (6.0.7)
Microsoft.AspNetCore.App (6.0.22)
Microsoft.AspNetCore (>= 6.0.22)
Microsoft.AspNetCore.Authorization (>= 6.0.22)
Microsoft.AspNetCore.Components (>= 6.0.22)
Microsoft.AspNetCore.DataProtection (>= 6.0.22)
Microsoft.AspNetCore.Diagnostics (>= 6.0.22)
Microsoft.AspNetCore.Http (>= 6.0.22)
Microsoft.AspNetCore.Routing (>= 6.0.22)
Microsoft.Extensions.Configuration (>= 6.0.22)
Microsoft.Extensions.DependencyInjection (>= 6.0.22)
Microsoft.Extensions.Logging (>= 6.0.22)
Newtonsoft.Json (13.0.3)
GROUP Build
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
FAKE.Core.Target (5.23.1)
FAKE.Core.Context (>= 5.23.1)
FSharp.Control.Reactive (>= 5.0.2)
FSharp.Core (>= 6.0.1)
FAKE.DotNet.Cli (5.23.1)
FAKE.Core.Environment (>= 5.23.1)
FAKE.Core.Process (>= 5.23.1)
FAKE.Core.String (>= 5.23.1)
FAKE.Core.Trace (>= 5.23.1)
FAKE.DotNet.MSBuild (>= 5.23.1)
FAKE.IO.FileSystem (>= 5.23.1)
Mono.Posix.NETStandard (>= 1.0)
Newtonsoft.Json (>= 13.0.1)
FAKE.DotNet.MSBuild (5.23.1)
FAKE.Core.Environment (>= 5.23.1)
FAKE.Core.Process (>= 5.23.1)
FAKE.Core.String (>= 5.23.1)
FAKE.Core.Trace (>= 5.23.1)
FAKE.IO.FileSystem (>= 5.23.1)
MSBuild.StructuredLogger (>= 2.1.758)
FAKE.DotNet.Testing.Expecto (5.23.1)
FAKE.Core.Process (>= 5.23.1)
FAKE.Core.String (>= 5.23.1)
FAKE.Core.Trace (>= 5.23.1)
FAKE.DotNet.Cli (>= 5.23.1)
FAKE.IO.FileSystem (5.23.1)
FAKE.Core.String (>= 5.23.1)
FSharp.Core (>= 6.0.1)
GROUP Docs
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
FSharp.Compiler.Service (41.0.8)
FSharp.Core (>= 6.0.2)
System.Collections.Immutable (>= 6.0)
System.Memory (>= 4.5.4)
System.Reflection.Metadata (>= 6.0.1)
FSharp.Formatting (14.0.1)
FSharp.Compiler.Service (>= 41.0.3)
FSharp.Core (>= 6.0.0)
Newtonsoft.Json (>= 13.0.1)
GROUP Performance
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
BenchmarkDotNet (0.13.7)
BenchmarkDotNet.Annotations (>= 0.13.7)
CommandLineParser (>= 2.9.1)
Iced (>= 1.17.0)
Microsoft.CodeAnalysis.CSharp (>= 4.5.0)
Microsoft.DotNet.PlatformAbstractions (>= 3.1.6)
Microsoft.Win32.Registry (>= 5.0)
Perfolizer (>= 0.2.1)
System.Management (>= 6.0)
System.Text.Json (>= 6.0.5)
BenchmarkDotNet.Diagnostics.Windows (0.13.7)
BenchmarkDotNet (>= 0.13.7)
Microsoft.Diagnostics.Tracing.TraceEvent (>= 3.0.2)
Microsoft.Diagnostics.Tracing.TraceEvent (3.0.8)
Microsoft.Win32.Registry (>= 4.7)
System.Security.Principal.Windows (>= 4.7)
GROUP Test
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
Expecto (10.2.1)
FSharp.Core (>= 6.0.1)
Mono.Posix.NETStandard (>= 1.0)
FsCheck (2.16.5)
FSharp.Core (>= 6.0.1)
Microsoft.NET.Test.Sdk (17.7.2)
Microsoft.CodeCoverage (>= 17.7.2)
Microsoft.TestPlatform.TestHost (>= 17.7.2)
NUnit (3.13.3)
NETStandard.Library (>= 2.0)
NUnit3TestAdapter (4.5.0)
GROUP Web
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
Giraffe (6.2.0)
FSharp.Core (>= 6.0.3)
Microsoft.AspNetCore.Http.Abstractions (>= 2.1)
Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
Newtonsoft.Json (>= 13.0.3)
TaskBuilder.fs (>= 2.1)
Utf8Json (>= 1.3.7)
Microsoft.AspNetCore.Authentication.JwtBearer (6.0.22)
Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 6.15.1)
Microsoft.EntityFrameworkCore (6.0.22)
Microsoft.EntityFrameworkCore.Abstractions (>= 6.0.22)
Microsoft.EntityFrameworkCore.Analyzers (>= 6.0.22)
Microsoft.Extensions.Caching.Memory (>= 6.0.1)
Microsoft.Extensions.DependencyInjection (>= 6.0.1)
Microsoft.Extensions.Logging (>= 6.0.1)
System.Collections.Immutable (>= 6.0)
System.Diagnostics.DiagnosticSource (>= 6.0.1)
Microsoft.EntityFrameworkCore.Sqlite (6.0.22)
Microsoft.EntityFrameworkCore.Relational (>= 6.0.22)
SQLitePCLRaw.bundle_e_sqlite3 (>= 2.1.2)
Saturn (0.16.1)
FSharp.Core (>= 6.0.1)
Giraffe (>= 6.0.0)
Microsoft.AspNetCore.Authentication.Cookies (>= 6.0.4)
Microsoft.AspNetCore.Authentication.OpenIdConnect (>= 6.0.4)
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation (>= 6.0.4)
Microsoft.AspNetCore.Session (>= 2.2.0)
Microsoft.Extensions.DependencyInjection (>= 6.0.0)
Suave (2.6.2)
FSharp.Core (>= 6.0.1)
GITHUB
remote: fsprojects/FSharpx.Collections
specs:
src/FSharpx.Collections/Collections.fs (a1b69514a64c94ec46b37e7fd0f471b8c63e2a5b)
remote: fsharp/FAKE
specs:
modules/Octokit/Octokit.fsx (8af10ad6bfcc1b6e68e1f2c725c8b5a2b6a2b4b8)
HTTP
remote: https://raw.githubusercontent.com/fsprojects/Paket/master/src/Paket.Core/AssemblyInfo.fs
specs:
src/AssemblyInfo.fs
GIT
remote: https://github.com/fsprojects/FSharp.Data.git
specs:
src/FSharp.Data/ (master)
remote: https://github.com/fsprojects/Argu.git
specs:
src/Argu/ (6.0.0)`,
'paket.local': `// Local overrides for paket.dependencies
// This file is used for local development overrides
// and should not be committed to version control
// Override package versions for local development
nuget FSharp.Core 6.0.7
nuget Newtonsoft.Json 13.0.3
// Local source for testing
source C:\\Local\\MyPackages
// Disable specific packages temporarily
// nuget SomePackage disable
// Use local git repository
// git file:///c:/dev/MyLibrary main src/MyLibrary/
// Development-specific settings
storage: packages
content: once
copy_local: true`,
'paket.template': `type project
id MyFSharpProject
version 1.0.0
authors Your Name
owners Your Name
description
A comprehensive F# project template with Paket dependency management
tags
fsharp, paket, template, dotnet
summary A template for F# projects using Paket
licenseUrl https://github.com/yourname/yourproject/blob/master/LICENSE
projectUrl https://github.com/yourname/yourproject
iconUrl https://raw.githubusercontent.com/yourname/yourproject/master/icon.png
releaseNotes
Initial release with Paket integration
copyright Copyright 2024
requireLicenseAcceptance false
files
bin/Release/net6.0/MyFSharpProject.dll ==> lib/net6.0
bin/Release/net6.0/MyFSharpProject.xml ==> lib/net6.0
dependencies
FSharp.Core >= LOCKEDVERSION
excludedgroups
Build
Test`,
'src/Library.fs': `namespace MyFSharpProject
/// Core library module demonstrating Paket dependency management
module Core =
open System
open Newtonsoft.Json
/// Sample data type for JSON serialization
type Person = {
Id: int
Name: string
Email: string
BirthDate: DateTime
}
/// Create a sample person
let createPerson id name email birthDate =
{ Id = id; Name = name; Email = email; BirthDate = birthDate }
/// Serialize person to JSON using Newtonsoft.Json
let personToJson (person: Person) =
JsonConvert.SerializeObject(person, Formatting.Indented)
/// Deserialize person from JSON
let personFromJson (json: string) =
try
JsonConvert.DeserializeObject<Person>(json) |> Ok
with
| ex -> Error ex.Message
/// Example using FSharp.Core features
let processPersons persons =
persons
|> List.map (fun p -> { p with Name = p.Name.ToUpper() })
|> List.sortBy (fun p -> p.BirthDate)
|> List.filter (fun p -> p.BirthDate.Year >= 1990)
/// HTTP utilities module
module Http =
open System.Net.Http
open System.Threading.Tasks
open System.Text
/// Simple HTTP client wrapper
type HttpClient with
member this.GetStringAsync(url: string) =
task {
let! response = this.GetAsync(url)
response.EnsureSuccessStatusCode() |> ignore
let! content = response.Content.ReadAsStringAsync()
return content
}
member this.PostJsonAsync(url: string, json: string) =
task {
let content = new StringContent(json, Encoding.UTF8, "application/json")
let! response = this.PostAsync(url, content)
response.EnsureSuccessStatusCode() |> ignore
let! responseContent = response.Content.ReadAsStringAsync()
return responseContent
}
/// Configuration module
module Config =
open System
open System.IO
open Newtonsoft.Json
/// Application configuration
type AppConfig = {
DatabaseConnection: string
ApiKey: string
Debug: bool
Port: int
AllowedOrigins: string list
}
/// Default configuration
let defaultConfig = {
DatabaseConnection = "Data Source=app.db"
ApiKey = "your-api-key"
Debug = true
Port = 8080
AllowedOrigins = ["http://localhost:3000"]
}
/// Load configuration from file
let loadConfig (filePath: string) =
if File.Exists(filePath) then
try
let json = File.ReadAllText(filePath)
JsonConvert.DeserializeObject<AppConfig>(json) |> Ok
with
| ex -> Error $"Failed to load config: {ex.Message}"
else
Error "Configuration file not found"
/// Save configuration to file
let saveConfig (config: AppConfig) (filePath: string) =
try
let json = JsonConvert.SerializeObject(config, Formatting.Indented)
File.WriteAllText(filePath, json)
Ok ()
with
| ex -> Error $"Failed to save config: {ex.Message}"`,
'src/MyFSharpProject.fsproj': `<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<WarningsNotAsErrors>FS0025</WarningsNotAsErrors>
</PropertyGroup>
<ItemGroup>
<Compile Include="Library.fs" />
</ItemGroup>
<Import Project="..\\..\\paket.targets" />
</Project>`,
'tests/Tests.fs': `module Tests
open Expecto
open MyFSharpProject.Core
open MyFSharpProject.Config
open System
let configTests =
testList "Configuration Tests" [
test "Default config should have correct values" {
let config = defaultConfig
Expect.equal config.Port 8080 "Default port should be 8080"
Expect.isTrue config.Debug "Debug should be enabled by default"
Expect.hasLength config.AllowedOrigins 1 "Should have one allowed origin"
}
test "Config serialization should work" {
let config = defaultConfig
let result = saveConfig config "test-config.json"
Expect.isOk result "Should save config successfully"
let loadResult = loadConfig "test-config.json"
Expect.isOk loadResult "Should load config successfully"
match loadResult with
| Ok loadedConfig ->
Expect.equal loadedConfig.Port config.Port "Port should match"
Expect.equal loadedConfig.Debug config.Debug "Debug should match"
| Error _ -> failtest "Failed to load config"
}
]
let coreTests =
testList "Core Tests" [
test "Person creation should work" {
let person = createPerson 1 "John Doe" "john@example.com" (DateTime(1990, 1, 1))
Expect.equal person.Id 1 "ID should be 1"
Expect.equal person.Name "John Doe" "Name should match"
Expect.equal person.Email "john@example.com" "Email should match"
}
test "JSON serialization should work" {
let person = createPerson 1 "John Doe" "john@example.com" (DateTime(1990, 1, 1))
let json = personToJson person
Expect.stringContains json "John Doe" "JSON should contain name"
Expect.stringContains json "john@example.com" "JSON should contain email"
}
test "JSON deserialization should work" {
let person = createPerson 1 "John Doe" "john@example.com" (DateTime(1990, 1, 1))
let json = personToJson person
let result = personFromJson json
Expect.isOk result "Deserialization should succeed"
match result with
| Ok deserializedPerson ->
Expect.equal deserializedPerson.Name person.Name "Names should match"
Expect.equal deserializedPerson.Email person.Email "Emails should match"
| Error _ -> failtest "Deserialization failed"
}
test "Process persons should filter and sort correctly" {
let persons = [
createPerson 1 "alice" "alice@example.com" (DateTime(1985, 1, 1))
createPerson 2 "bob" "bob@example.com" (DateTime(1995, 1, 1))
createPerson 3 "charlie" "charlie@example.com" (DateTime(2000, 1, 1))
]
let processed = processPersons persons
Expect.hasLength processed 2 "Should filter out person born before 1990"
Expect.equal processed.[0].Name "BOB" "Names should be uppercase"
Expect.equal processed.[1].Name "CHARLIE" "Names should be uppercase"
Expect.isTrue (processed.[0].BirthDate <= processed.[1].BirthDate) "Should be sorted by birth date"
}
]
[<Tests>]
let allTests =
testList "All Tests" [
configTests
coreTests
]`,
'tests/Tests.fsproj': `<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>false</IsPackable>
<GenerateProgramFile>false</GenerateProgramFile>
</PropertyGroup>
<ItemGroup>
<Compile Include="Tests.fs" />
<Compile Include="Program.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../src/MyFSharpProject.fsproj" />
</ItemGroup>
<Import Project="..\\paket.targets" />
</Project>`,
'tests/Program.fs': `module Program
open Expecto
[<EntryPoint>]
let main argv =
Tests.runTestsInAssemblyWithCLIArgs [] argv`,
'build.fsx': `#r "paket: groupref Build //"
#load ".fake/build.fsx/intellisense.fsx"
open Fake.Core
open Fake.DotNet
open Fake.IO
open Fake.IO.FileSystemOperators
open Fake.IO.Globbing.Operators
open Fake.Core.TargetOperators
open Fake.DotNet.Testing.Expecto
// Build configuration
let buildDir = "./build/"
let deployDir = "./deploy/"
let srcGlob = "src/**/*.fsproj"
let testsGlob = "tests/**/*.fsproj"
// Paket targets
Target.create "RestorePackages" (fun _ ->
Paket.restore (fun p ->
{ p with ToolType = ToolType.CreateLocalTool() }
)
)
Target.create "UpdatePackages" (fun _ ->
Paket.update (fun p ->
{ p with ToolType = ToolType.CreateLocalTool() }
)
)
Target.create "InstallPackages" (fun _ ->
Paket.install (fun p ->
{ p with ToolType = ToolType.CreateLocalTool() }
)
)
// Build targets
Target.create "Clean" (fun _ ->
!! "src/**/bin"
++ "src/**/obj"
++ "tests/**/bin"
++ "tests/**/obj"
++ buildDir
++ deployDir
|> Shell.cleanDirs
)
Target.create "AssemblyInfo" (fun _ ->
let getAssemblyInfoAttributes projectName =
[ AssemblyInfo.Title (projectName)
AssemblyInfo.Product projectName
AssemblyInfo.Version "1.0.0"
AssemblyInfo.Metadata("githash", Git.Information.getCurrentSHA1 ".") ]
let getProjectDetails projectPath =
let projectName = System.IO.Path.GetFileNameWithoutExtension(projectPath)
( projectPath,
projectName,
System.IO.Path.GetDirectoryName(projectPath),
(getAssemblyInfoAttributes projectName)
)
!! srcGlob
|> Seq.map getProjectDetails
|> Seq.iter (fun (projFileName, _, folderName, attributes) ->
AssemblyInfoFile.createFSharp (folderName </> "AssemblyInfo.fs") attributes
)
)
Target.create "Build" (fun _ ->
!! srcGlob
|> Seq.iter (DotNet.build (fun p ->
{ p with
Configuration = DotNet.BuildConfiguration.Release
OutputPath = Some buildDir }))
)
Target.create "BuildTests" (fun _ ->
!! testsGlob
|> Seq.iter (DotNet.build (fun p ->
{ p with
Configuration = DotNet.BuildConfiguration.Debug }))
)
Target.create "RunTests" (fun _ ->
!! testsGlob
|> Seq.iter (fun proj ->
DotNet.exec id "run" (sprintf "--project %s" proj)
|> fun result ->
if not result.OK then
failwithf "Tests failed for project %s" proj
)
)
Target.create "GenerateDocs" (fun _ ->
let source = "./docs"
let template = "./docs/template"
let output = "./docs/output"
Shell.cleanDir output
// Use FSharp.Formatting to generate documentation
DotNet.exec id "fsdocs" (sprintf "build --input %s --output %s" source output)
|> ignore
)
Target.create "Pack" (fun _ ->
Paket.pack (fun p ->
{ p with
ToolType = ToolType.CreateLocalTool()
OutputPath = deployDir
Version = "1.0.0"
ReleaseNotes = "Initial release"
}
)
)
Target.create "Deploy" (fun _ ->
!! (deployDir + "/*.nupkg")
|> Seq.iter (fun pkg ->
Paket.push (fun p ->
{ p with
ToolType = ToolType.CreateLocalTool()
WorkingDir = deployDir
PublishUrl = "https://www.nuget.org/api/v2/package"
ApiKey = Environment.environVarOrDefault "NUGET_API_KEY" ""
}
) pkg
)
)
// Build order
"Clean"
==> "RestorePackages"
==> "AssemblyInfo"
==> "Build"
==> "BuildTests"
==> "RunTests"
==> "GenerateDocs"
==> "Pack"
"Pack" ==> "Deploy"
Target.runOrDefault "RunTests"`,
'.paket/paket.bootstrapper.exe.config': `<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.4.0" newVersion="4.3.4.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>`,
'scripts/paket-commands.sh': `#!/bin/bash
# Paket command reference and automation scripts
echo "Paket Dependency Manager Commands"
echo "=================================="
# Initialize Paket in a new project
init_paket() {
echo "Initializing Paket..."
dotnet tool install paket --tool-path .paket
.paket/paket init
echo "Paket initialized successfully!"
}
# Install dependencies
install_deps() {
echo "Installing dependencies..."
.paket/paket install
echo "Dependencies installed!"
}
# Update dependencies
update_deps() {
echo "Updating dependencies..."
.paket/paket update
echo "Dependencies updated!"
}
# Add a new package
add_package() {
if [ -z "$1" ]; then
echo "Usage: add_package <package-name> [version] [group]"
return 1
fi
local package=$1
local version=${2
} - ""
};
local;
group = $;
{
3;
-"";
}
local;
cmd = ".paket/paket add nuget $package";
if ([!-z, "$version"])
;
then;
cmd = "$cmd --version $version";
fi;
if ([!-z, "$group"])
;
then;
cmd = "$cmd --group $group";
fi;
echo;
"Adding package: $package";
eval;
$cmd;
echo;
"Package added successfully!";
#;
Remove;
a;
package;
remove_package();
{
if ([-z, "$1"])
;
then;
echo;
"Usage: remove_package <package-name> [group]";
return 1;
fi;
local;
package = $1;
local;
group = $;
{
2;
-"";
}
local;
cmd = ".paket/paket remove nuget $package";
if ([!-z, "$group"])
;
then;
cmd = "$cmd --group $group";
fi;
echo;
"Removing package: $package";
eval;
$cmd;
echo;
"Package removed successfully!";
}
#;
Show;
outdated;
packages;
show_outdated();
{
echo;
"Checking for outdated packages..."
.paket / paket;
outdated;
}
#;
Show;
dependency;
tree;
show_deps();
{
echo;
"Dependency tree:"
.paket / paket;
show - groups;
echo;
""
.paket / paket;
show - installed - packages;
}
#;
Restore;
packages;
restore();
{
echo;
"Restoring packages..."
.paket / paket;
restore;
echo;
"Packages restored!";
}
#;
Generate;
include;
scripts;
generate_includes();
{
echo;
"Generating include scripts..."
.paket / paket;
generate - include - scripts;
echo;
"Include scripts generated!";
}
#;
Find;
packages;
find_package();
{
if ([-z, "$1"])
;
then;
echo;
"Usage: find_package <search-term>";
return 1;
fi;
echo;
"Searching for packages containing: $1"
.paket / paket;
find - packages--;
search - term;
"$1";
}
#;
Validate;
paket;
files;
validate();
{
echo;
"Validating Paket files..."
.paket / paket;
check;
echo;
"Validation complete!";
}
#;
Clean;
paket;
cache;
clean_cache();
{
echo;
"Cleaning Paket cache..."
.paket / paket;
clear - cache;
echo;
"Cache cleared!";
}
#;
Pack;
for (NuGet; pack_nuget(); {
echo, "Packing for NuGet...":
.paket / paket, pack, : . / nuget,
echo, "NuGet packages created in ./nuget/":
})
#;
Push;
to;
NuGet;
push_nuget();
{
if ([-z, "$1"])
;
then;
echo;
"Usage: push_nuget <api-key>";
return 1;
fi;
echo;
"Pushing packages to NuGet..."
.paket / paket;
push--;
api - key;
"$1". / nuget;
echo;
"Packages pushed to NuGet!";
}
#;
Convert;
from;
packages.config;
convert_from_nuget();
{
echo;
"Converting from packages.config..."
.paket / paket;
convert - from - nuget;
echo;
"Conversion complete!";
}
#;
Auto - restore;
setup;
setup_auto_restore();
{
echo;
"Setting up auto-restore..."
.paket / paket;
auto - restore;
on;
echo;
"Auto-restore enabled!";
}
#;
Simplify;
dependencies;
simplify();
{
echo;
"Simplifying dependencies..."
.paket / paket;
simplify;
echo;
"Dependencies simplified!";
}
#;
Show;
help;
show_help();
{
echo;
"Available commands:";
echo;
" init_paket - Initialize Paket in current directory";
echo;
" install_deps - Install all dependencies";
echo;
" update_deps - Update all dependencies";
echo;
" add_package <name> - Add a new package";
echo;
" remove_package <name> - Remove a package";
echo;
" show_outdated - Show outdated packages";
echo;
" show_deps - Show dependency tree";
echo;
" restore - Restore packages";
echo;
" generate_includes - Generate include scripts";
echo;
" find_package <term> - Search for packages";
echo;
" validate - Validate Paket files";
echo;
" clean_cache - Clean Paket cache";
echo;
" pack_nuget - Pack for NuGet";
echo;
" push_nuget <api-key> - Push to NuGet";
echo;
" convert_from_nuget - Convert from packages.config";
echo;
" setup_auto_restore - Enable auto-restore";
echo;
" simplify - Simplify dependencies";
echo;
" show_help - Show this help";
}
#;
Main;
command;
dispatcher;
"$1" in
"init";
init_paket;
;
"install";
install_deps;
;
"update";
update_deps;
;
"add";
add_package;
"$2";
"$3";
"$4";
;
"remove";
remove_package;
"$2";
"$3";
;
"outdated";
show_outdated;
;
"deps";
show_deps;
;
"restore";
restore;
;
"includes";
generate_includes;
;
"find";
find_package;
"$2";
;
"validate";
validate;
;
"clean";
clean_cache;
;
"pack";
pack_nuget;
;
"push";
push_nuget;
"$2";
;
"convert";
convert_from_nuget;
;
"auto-restore";
setup_auto_restore;
;
"simplify";
simplify;
;
"help" | "";
show_help;
;
* ;
echo;
"Unknown command: $1";
show_help;
;
esac `,
'README.md': `;
#;
F;
#;
Paket;
Dependency;
Manager;
A;
modern;
dependency;
manager;
for (F; #; and.NET)
projects;
providing;
precise;
dependency;
resolution, reproducible;
builds, and;
powerful;
package;
management;
capabilities.
;
#;
#;
Features
- ** Precise;
Dependency;
Resolution ** ;
Deterministic;
dependency;
resolution;
with (conflict)
detection
- ** Reproducible;
Builds ** ;
Lock;
files;
ensure;
consistent;
builds;
across;
environments
- ** Group - Based;
Dependencies ** ;
Organize;
dependencies;
into;
logical;
groups
- ** Multiple;
Sources ** ;
Support;
for (NuGet, Git, GitHub, and; HTTP; sources
- ** Framework)
Restrictions ** ;
Target;
specific.NET;
frameworks
- ** Transitive;
Control ** ;
Fine - grained;
control;
over;
transitive;
dependencies
- ** Source;
Code;
Dependencies ** ;
Include;
source;
files;
directly;
from;
repositories
- ** Integration ** ;
Seamless;
MSBuild;
and.NET;
CLI;
integration;
#;
#;
Quick;
Start;
#;
#;
#;
Prerequisites
- .NET;
6.0;
SDK;
or;
later
- F;
#;
development;
tools;
#;
#;
#;
Installation;
`\`\`bash
# Install Paket as a local tool
dotnet tool install paket --tool-path .paket
# Initialize Paket in your project
.paket/paket init
# Install dependencies
.paket/paket install
\`\`\`
### Basic Usage
\`\`\`bash
# Add a package
.paket/paket add nuget Newtonsoft.Json
# Update dependencies
.paket/paket update
# Restore packages
.paket/paket restore
\`\`\`
## Project Structure
\`\`\`
├── .paket/
│ ├── paket.bootstrapper.exe # Paket bootstrapper
│ └── paket.targets # MSBuild targets
├── src/
│ ├── Library.fs # Main library code
│ └── MyFSharpProject.fsproj # Project file
├── tests/
│ ├── Tests.fs # Unit tests
│ ├── Program.fs # Test runner
│ └── Tests.fsproj # Test project file
├── scripts/
│ └── paket-commands.sh # Helper scripts
├── paket.dependencies # Dependency specification
├── paket.lock # Lock file (auto-generated)
├── paket.local # Local overrides
├── paket.template # NuGet package template
└── build.fsx # Build script
\`\`\`
## Configuration Files
### paket.dependencies
Main dependency specification file:
\`\`\`
// Framework restrictions
framework: net6.0, netstandard2.0
// Main NuGet source
source https://api.nuget.org/v3/index.json
// Dependencies
nuget FSharp.Core >= 6.0.0
nuget Newtonsoft.Json >= 13.0.0
// Group-based dependencies
group Test
source https://api.nuget.org/v3/index.json
framework: net6.0
nuget Expecto >= 10.0.0
nuget FsCheck >= 2.16.0
// Git dependencies
git https://github.com/fsprojects/FSharp.Data.git master src/FSharp.Data/
// HTTP dependencies
http https://raw.githubusercontent.com/fsprojects/Paket/master/src/Paket.Core/AssemblyInfo.fs src/AssemblyInfo.fs
\`\`\`
### paket.lock
Auto-generated lock file ensuring reproducible builds:
\`\`\`
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
FSharp.Core (6.0.7)
Newtonsoft.Json (13.0.3)
GROUP Test
RESTRICTION: >= net6.0
NUGET
remote: https://api.nuget.org/v3/index.json
Expecto (10.2.1)
FsCheck (2.16.5)
\`\`\`
## Dependency Groups
Organize dependencies into logical groups:
\`\`\`
// Main dependencies
nuget FSharp.Core
nuget Microsoft.AspNetCore.App
// Web development group
group Web
nuget Giraffe
nuget Saturn
nuget Suave
// Testing group
group Test
nuget Expecto
nuget FsCheck
nuget NUnit
// Build tools group
group Build
nuget FAKE.Core.Target
nuget FAKE.DotNet.Cli
\`\`\`
## Advanced Features
### Framework Restrictions
Target specific .NET frameworks:
\`\`\`
framework: net6.0, netstandard2.0, netframework461
// Per-group restrictions
group Web
framework: net6.0
nuget Giraffe
\`\`\`
### Version Constraints
Specify version requirements:
\`\`\`
nuget FSharp.Core >= 6.0.0 // Minimum version
nuget Newtonsoft.Json ~> 13.0 // Compatible version
nuget Microsoft.AspNetCore.App == 6.0.22 // Exact version
nuget SomePackage >= 1.0 < 2.0 // Version range
\`\`\`
### Source Code Dependencies
Include source files directly:
\`\`\`
// GitHub files
github fsprojects/FSharpx.Collections src/FSharpx.Collections/Collections.fs
// Git repositories
git https://github.com/fsprojects/FSharp.Data.git master src/FSharp.Data/
// HTTP files
http https://raw.githubusercontent.com/fsprojects/Paket/master/src/Paket.Core/AssemblyInfo.fs src/AssemblyInfo.fs
\`\`\`
### Local Development
Use \`paket.local\` for local overrides:
\`\`\`
// Override versions
nuget FSharp.Core 6.0.7
// Add local sources
source C:\\Local\\MyPackages
// Use local git repositories
git file:///c:/dev/MyLibrary main src/MyLibrary/
\`\`\`
## Commands
### Package Management
\`\`\`bash
# Add packages
.paket/paket add nuget FSharp.Core
.paket/paket add nuget Expecto --group Test
# Remove packages
.paket/paket remove nuget Expecto --group Test
# Update packages
.paket/paket update
.paket/paket update nuget FSharp.Core
# Install packages
.paket/paket install
\`\`\`
### Information Commands
\`\`\`bash
# Show outdated packages
.paket/paket outdated
# Show installed packages
.paket/paket show-installed-packages
# Show dependency groups
.paket/paket show-groups
# Find packages
.paket/paket find-packages --search-term "json"
\`\`\`
### Project Commands
\`\`\`bash
# Initialize Paket
.paket/paket init
# Convert from packages.config
.paket/paket convert-from-nuget
# Simplify dependencies
.paket/paket simplify
# Auto-restore setup
.paket/paket auto-restore on
\`\`\`
### Validation and Cleanup
\`\`\`bash
# Validate dependencies
.paket/paket check
# Clear cache
.paket/paket clear-cache
# Generate include scripts
.paket/paket generate-include-scripts
\`\`\`
## NuGet Package Creation
### paket.template
Define package metadata:
\`\`\`
type project
id MyFSharpProject
version 1.0.0
authors Your Name
description A comprehensive F# project
tags fsharp, paket, template
licenseUrl https://github.com/yourname/yourproject/blob/master/LICENSE
projectUrl https://github.com/yourname/yourproject
files
bin/Release/net6.0/MyFSharpProject.dll ==> lib/net6.0
dependencies
FSharp.Core >= LOCKEDVERSION
\`\`\`
### Creating Packages
\`\`\`bash
# Pack packages
.paket/paket pack ./nuget
# Push to NuGet
.paket/paket push --api-key YOUR_API_KEY ./nuget
\`\`\`
## Integration with Build Tools
### FAKE Integration
\`\`\`fsharp
#r "paket: groupref Build //"
open Fake.DotNet
Target.create "RestorePackages" (fun _ ->
Paket.restore (fun p ->
{ p with ToolType = ToolType.CreateLocalTool() }
)
)
Target.create "UpdatePackages" (fun _ ->
Paket.update (fun p ->
{ p with ToolType = ToolType.CreateLocalTool() }
)
)
\`\`\`
### MSBuild Integration
Projects automatically reference \`paket.targets\`:
\`\`\`xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<Import Project="..\\paket.targets" />
</Project>
\`\`\`
## CI/CD Integration
### GitHub Actions
\`\`\`yaml
name: Build and Test
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Setup .NET
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Restore Paket
run: .paket/paket restore
- name: Build
run: dotnet build
- name: Test
run: dotnet test
\`\`\`
### Docker
\`\`\`dockerfile
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY paket.dependencies paket.lock ./
COPY .paket .paket/
RUN .paket/paket restore
COPY . .
RUN dotnet build -c Release
\`\`\`
## Best Practices
### Dependency Management
1. **Use Lock Files**: Always commit \`paket.lock\` for reproducible builds
2. **Group Dependencies**: Organize dependencies into logical groups
3. **Specify Constraints**: Use appropriate version constraints
4. **Regular Updates**: Keep dependencies up to date
5. **Local Overrides**: Use \`paket.local\` for development
### Performance
1. **Parallel Restore**: Use \`--parallel\` for faster operations
2. **Cache Management**: Clear cache when experiencing issues
3. **Selective Updates**: Update specific packages when needed
4. **Framework Targeting**: Use framework restrictions to reduce conflicts
### Security
1. **Source Verification**: Use trusted package sources
2. **Version Pinning**: Pin sensitive dependencies to specific versions
3. **Audit Dependencies**: Regular security audits
4. **Local Sources**: Validate local package sources
## Troubleshooting
### Common Issues
\`\`\`bash
# Clear cache and reinstall
.paket/paket clear-cache
.paket/paket install
# Force update
.paket/paket update --force
# Validate configuration
.paket/paket check
# Regenerate lock file
rm paket.lock
.paket/paket install
\`\`\`
### Conflict Resolution
1. **Version Conflicts**: Use version overrides in \`paket.dependencies\`
2. **Framework Issues**: Adjust framework restrictions
3. **Source Problems**: Verify source URLs and credentials
4. **Dependency Loops**: Use \`simplify\` to reduce complexity
## Migration
### From NuGet
\`\`\`bash
# Convert existing projects
.paket/paket convert-from-nuget
# Manual cleanup
rm packages.config
rm -rf packages/
\`\`\`
### From Other Tools
1. **NPM/Yarn**: Map dependencies manually
2. **pip/conda**: Use .NET equivalents where available
3. **Maven/Gradle**: Convert Java libraries to .NET equivalents
## Learning Resources
- [Paket Documentation](https://fsprojects.github.io/Paket/)
- [F# Dependency Management](https://fsharp.org/guides/package-management/)
- [.NET Package Management](https://docs.microsoft.com/en-us/nuget/)
- [Paket vs NuGet](https://fsprojects.github.io/Paket/paket-vs-nuget.html)
## Contributing
1. Fork the repository
2. Create a feature branch
3. Add comprehensive tests
4. Update documentation
5. Submit a pull request
## License
This project is licensed under the MIT License.`;
;