- Notifications
You must be signed in to change notification settings - Fork0
Build automation system for .NET
License
DevTeam/csharp-interactive
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
C# interactive build automation system makes it easy to build .NET projects. It can be part of your solution as a regular .NET console project or run C# scripts without compiling them, or even run in REPL mode - allowing you to run C# interactively.
✔️ Three IntegratedExecution Modes
Flexible interoperability between modes for diverse workflow requirements.
Seamless operation across Windows, Linux, and macOS environments.
Ability to debug in “.NET build project” mode, allowing developers to efficiently identify and fix problems during the compilation and build process.
No restrictive abstractions (e.g., Tasks, Targets, DependsOn) to limit script design:
- Pure .NET codebase – no proprietary syntax or hidden layers
- Adheres to industry-standard coding practices for maintainability
Granular control over builds, tests, and deployments with streamlined project configuration.
Consolidated build statistics.
Interactive
REPL (Read-Eval-Print-Loop) interface for interactive code evaluation. Please seethis page for installation details.
Launch the tool in the interactive mode:
dotnet csi
Simply enter C# commands sequentially one line after another and get the result in console output.
Running C# script
Direct execution of C# scripts without prior compilation:
- Zero-Compilation Workflow - execute .csx files directly using Roslyn scripting engines, bypassing traditional dotnet build steps for rapid iteration.
- Cross-Platform Scripting
- Windows - integrate with PowerShell/PowerShell Core automation pipelines
- Linux/macOS - combine with bash/zsh scripts via shebang directives (#!/usr/bin/env dotnet-script)
- Dependency Management - resolve NuGet packages in scripts via #r "nuget: PackageName/Version" syntax, with local cache optimization.
Run a specified script with a given argument:
dotnet csi ./MyDirectory/hello.csx World
Run a single script located in theMyDirectory directory:
dotnet csi ./MyDirectory World
Usage details
dotnet csi [options] [--] [script] [script arguments]
Executes a script if specified, otherwise launches an interactive REPL (Read Eval Print Loop).
--
- Indicates that the remaining arguments should not be treated as options.
script
- The path to the script file to run. If no such file is found, the command will treat it as a directory and look for a single script file inside that directory.
script arguments
- Script arguments are accessible in a script via the global listArgs[index]
by an argument index.
@file
- Read the response file for more options.
Supported options:
Option | Description | Alternative form |
---|---|---|
--help | Show how to use the command. | /? ,-h ,/h ,/help |
--version | Display the tool version. | /version |
--source | Specify the NuGet package source to use. Supported formats: URL, or a UNC directory path. | -s ,/s ,/source |
--property <key=value> | Define a key-value pair(s) for the script properties calledProps, which is accessible in scripts. | -p ,/property ,/p |
--property:<key=value> | Define a key-value pair(s) in MSBuild style for the script properties calledProps, which is accessible in scripts. | -p:<key=value> ,/property:<key=value> ,/p:<key=value> ,--property:key1=val1;key2=val2 |
.NET build project
Seamless integration into existing solutions as a standard .NET console project. Please seethis page for details on how to install theproject template.
Create a console projectBuild containing a script from the templatebuild
dotnet new build -o ./Build
The created project contains 2 entry points:
- Program.csx to run as a script
dotnet csi ./Build
- Program.cs to run as .NET application
dotnet run --project ./Build
- Build project example
- CSharp Interactive build project
- Pure.DI build project
- Immutype build project
- Comparison with Cake and Nuke
- Output, logging and tracing
- Writing a line to a build log
- Writing a line highlighted with "Header" color to a build log
- Writing an empty line to a build log
- Registering errors in the build log
- Registering warnings in the build log
- Registering a summary in the build log
- Registering information in the build log
- Registering trace information in the build log
- Arguments and parameters
- Microsoft DI
- NuGet
- Command Line
- Docker CLI
- .NET CLI
- Adding a NuGet package
- Adding a NuGet source
- Adding a project reference
- Adding projects to the solution file
- Adding project-to-project (P2P) references
- Building a project
- Building a project using MSBuild
- Cleaning a project
- Clearing the specified NuGet cache type
- Creating a new project, configuration file, or solution based on the specified template
- Deleting a NuGet package to the server
- Disabling a NuGet source
- Displaing template package metadata
- Enabling a NuGet source
- Enabling or disabling workload-set update mode
- Executing a dotnet application
- Fixing (non code style) analyzer issues
- Fixing code style issues
- Formatting a code
- Getting a value of a specified NuGet configuration setting
- Installing a template package
- Installing optional workloads
- Installing the .NET local tools that are in scope for the current directory
- Installing the specified .NET tool
- Installing workloads needed for a project or a solution
- Invoking a local tool
- Packing a code into a NuGet package
- Printing a dependency graph for NuGet package
- Printing all .NET tools of the specified type currently installed
- Printing all configured NuGet sources
- Printing all projects in a solution file
- Printing available templates to be run using dotnet new
- Printing installed workloads
- Printing nuget configuration files currently being applied to a directory
- Printing NuGet packages for a project
- Printing project references for a project
- Printing the latest available version of the .NET SDK and .NET Runtime, for each feature band
- Printing the location of the specified NuGet cache type
- Publishing an application and its dependencies to a folder for deployment to a hosting system
- Pushing a NuGet package to the server
- Removing a NuGet package
- Removing a project or multiple projects from the solution file
- Removing an existing source from your NuGet configuration files
- Repairing workloads installations
- Restoring the dependencies and tools of a project
- Running a .NET application
- Running a custom .NET command
- Running source code without any explicit compile or launch commands
- Running tests from the specified assemblies
- Running tests under dotCover
- Searching all .NET tools that are published to NuGet
- Searching for a NuGet package
- Searching for optional workloads
- Searching for the templates
- Setting the value of a specified NuGet configuration setting
- Signing with certificate
- Storing the specified assemblies in the runtime package store.
- Testing a project using the MSBuild VSTest target
- Testing from the specified project
- Uninstalling a specified workload
- Uninstalling a template package
- Uninstalling the specified .NET tool
- Unsetting the value of a specified NuGet configuration setting
- Updating a NuGet source
- Updating installed template packages
- Updating installed workloads
- Updating the specified .NET tool
- Working with development certificates
- Running C# script
- Shutting down build servers
- TeamCity API
WriteLine("Hello");
WriteLine("Hello",Header);WriteLine("Hello ".WithColor(Header),"world!");
WriteLine();
Error("Error info");Error("Error info","Error identifier");Error("Error: ".WithColor(),"datails".WithColor(Color.Details));
Warning("Warning info");Warning("Warning ","info".WithColor(Color.Details));
Summary("Summary message");Summary("Summary ","message".WithColor(Color.Details));
Info("Some info");Info("Some ","info".WithColor(Color.Details));
Trace("Some trace info");Trace("Some trace ","info".WithColor(Color.Details));
Args have got from the script arguments.
if(Args.Count>0){WriteLine(Args[0]);}if(Args.Count>1){WriteLine(Args[1]);}
WriteLine(Props["version"]);WriteLine(Props.Get("configuration","Release"));// Some CI/CDs have integration of these properties.// For example in TeamCity this property with all changes will be available in the next TeamCity steps.Props["version"]="1.1.6";
Host is actually the provider of all global properties and methods.
varpackages=Host.GetService<INuGet>();Host.WriteLine("Hello");
This method might be used to get access to different APIs likeINuGet orICommandLine.
GetService<INuGet>();varserviceProvider=GetService<IServiceProvider>();serviceProvider.GetService(typeof(INuGet));
Besides that, it is possible to get an instance ofSystem.IServiceProvider to access APIs.
publicvoidRun(){varserviceProvider=GetService<IServiceCollection>().AddTransient<MyTask>().BuildServiceProvider();varmyTask=serviceProvider.GetRequiredService<MyTask>();varexitCode=myTask.Run();exitCode.ShouldBe(0);}privateclassMyTask(ICommandLineRunnerrunner){publicint?Run()=>runner.Run(newCommandLine("whoami")).EnsureSuccess().ExitCode;}
usingHostApi;IEnumerable<NuGetPackage>packages=GetService<INuGet>().Restore(newNuGetRestoreSettings("IoC.Container").WithVersionRange(VersionRange.All));
usingHostApi;varpackagesPath=Path.Combine(Path.GetTempPath(),Guid.NewGuid().ToString()[..4]);varsettings=newNuGetRestoreSettings("IoC.Container").WithVersionRange(VersionRange.Parse("[1.3, 1.3.8)")).WithTargetFrameworkMoniker("net5.0").WithPackagesPath(packagesPath);IEnumerable<NuGetPackage>packages=GetService<INuGet>().Restore(settings);
usingHostApi;// Creates and run a simple command line"whoami".AsCommandLine().Run().EnsureSuccess();// Creates and run a simple command linenewCommandLine("whoami").Run().EnsureSuccess();// Creates and run a command line with argumentsnewCommandLine("cmd","/c","echo","Hello").Run();// Same as previous statementnewCommandLine("cmd","/c").AddArgs("echo","Hello").Run().EnsureSuccess();(newCommandLine("cmd")+"/c"+"echo"+"Hello").Run().EnsureSuccess();"cmd".AsCommandLine("/c","echo","Hello").Run().EnsureSuccess();("cmd".AsCommandLine()+"/c"+"echo"+"Hello").Run().EnsureSuccess();// Just builds a command line with multiple environment variablesvarcmd=newCommandLine("cmd","/c","echo","Hello").AddVars(("Var1","val1"),("var2","Val2"));// Same as previous statementcmd=newCommandLine("cmd")+"/c"+"echo"+"Hello"+("Var1","val1")+("var2","Val2");// Builds a command line to run from a specific working directorycmd=newCommandLine("cmd","/c","echo","Hello").WithWorkingDirectory("MyDyrectory");// Builds a command line and replaces all command line argumentscmd=newCommandLine("cmd","/c","echo","Hello").WithArgs("/c","echo","Hello !!!");
usingHostApi;GetService<ICommandLineRunner>().Run(newCommandLine("cmd","/c","DIR")).EnsureSuccess();// or the same thing using the extension methodnewCommandLine("cmd","/c","DIR").Run().EnsureSuccess();// using operator '+'varcmd=newCommandLine("cmd")+"/c"+"DIR";cmd.Run().EnsureSuccess();// with environment variablescmd=newCommandLine("cmd")+"/c"+"DIR"+("MyEnvVar","Some Value");cmd.Run().EnsureSuccess();
usingHostApi;awaitGetService<ICommandLineRunner>().RunAsync(newCommandLine("cmd","/C","DIR")).EnsureSuccess();// or the same thing using the extension methodvarresult=awaitnewCommandLine("cmd","/c","DIR").RunAsync().EnsureSuccess();
usingHostApi;varlines=newList<string>();varresult=newCommandLine("cmd","/c","SET").AddVars(("MyEnv","MyVal")).Run(output=>lines.Add(output.Line)).EnsureSuccess();lines.ShouldContain("MyEnv=MyVal");
usingHostApi;vartask=newCommandLine("cmd","/c","DIR").RunAsync().EnsureSuccess();varresult=newCommandLine("cmd","/c","SET").Run().EnsureSuccess();awaittask;
Cancellation will destroy the process and its child processes.
usingHostApi;varcancellationTokenSource=newCancellationTokenSource();vartask=newCommandLine("cmd","/c","TIMEOUT","/T","120").RunAsync(null,cancellationTokenSource.Token);cancellationTokenSource.CancelAfter(TimeSpan.FromMilliseconds(100));task.IsCompleted.ShouldBeFalse();
If timeout expired a process will be killed.
usingHostApi;varexitCode=newCommandLine("cmd","/c","TIMEOUT","/T","120").Run(null,TimeSpan.FromMilliseconds(1)).ExitCode;
usingHostApi;// Creates a base docker command linevardockerRun=newDockerRun().WithAutoRemove(true).WithInteractive(true).WithImage("mcr.microsoft.com/dotnet/sdk").WithPlatform("linux").WithContainerWorkingDirectory("/MyProjects").AddVolumes((ToAbsoluteLinuxPath(Environment.CurrentDirectory),"/MyProjects"));// Creates a new library project in a docker containerdockerRun.WithCommandLine(newDotNetCustom("new","classlib","-n","MyLib","--force")).Run().EnsureSuccess();// Builds the library project in a docker containervarresult=dockerRun.WithCommandLine(newDotNetBuild().WithProject("MyLib/MyLib.csproj")).Build().EnsureSuccess();stringToAbsoluteLinuxPath(stringpath)=>"/"+path.Replace(":","").Replace('\\','/');
usingHostApi;// Creates some command line to run in a docker containervarcmd=newCommandLine("whoami");// Runs the command line in a docker containervarresult=newDockerRun(cmd,"mcr.microsoft.com/dotnet/sdk").WithAutoRemove(true).Run().EnsureSuccess();
usingHostApi;varresult=newDotNetAddPackage().WithWorkingDirectory("MyLib").WithPackage("Pure.DI").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetAddSource().WithName("TestSource").WithSource(source).Run().EnsureSuccess();
usingHostApi;newDotNetAddReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).WithReferences(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();newDotNetRemoveReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).WithReferences(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();varlines=newList<string>();newDotNetListReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).Run(output=>lines.Add(output.Line));lines.Any(i=>i.Contains("MyLib.csproj")).ShouldBeFalse();
usingHostApi;newDotNetNew().WithTemplateName("sln").WithName("NySolution").WithForce(true).Run().EnsureSuccess();newDotNetSlnAdd().WithSolution("NySolution.sln").AddProjects(Path.Combine("MyLib","MyLib.csproj"),Path.Combine("MyTests","MyTests.csproj")).Run().EnsureSuccess();
usingHostApi;varresult=newDotNetAddReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).WithReferences(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();
usingHostApi;varmessages=newList<BuildMessage>();varresult=newDotNetBuild().WithWorkingDirectory("MyTests").Build(message=>messages.Add(message)).EnsureSuccess();result.Errors.Any(message=>message.State==BuildMessageState.StdError).ShouldBeFalse(result.ToString());result.ExitCode.ShouldBe(0,result.ToString());
usingHostApi;// Creates a new library project, running a command like: "dotnet new classlib -n MyLib --force"newDotNetNew().WithTemplateName("classlib").WithName("MyLib").WithForce(true).Build().EnsureSuccess();// Builds the library project, running a command like: "dotnet msbuild /t:Build -restore /p:configuration=Release -verbosity=detailed" from the directory "MyLib"varresult=newMSBuild().WithWorkingDirectory("MyLib").WithTarget("Build").WithRestore(true).AddProps(("configuration","Release")).WithVerbosity(DotNetVerbosity.Detailed).Build().EnsureSuccess();// The "result" variable provides details about a buildresult.Errors.Any(message=>message.State==BuildMessageState.StdError).ShouldBeFalse(result.ToString());result.ExitCode.ShouldBe(0,result.ToString());
usingHostApi;// Clean the project, running a command like: "dotnet clean" from the directory "MyLib"newDotNetClean().WithWorkingDirectory("MyLib").Build().EnsureSuccess();
usingHostApi;newDotNetNuGetLocalsClear().WithCacheLocation(NuGetCacheLocation.Temp).Run().EnsureSuccess();
usingHostApi;newDotNetNew().WithTemplateName("classlib").WithName("MyLib").WithForce(true).Run().EnsureSuccess();
usingHostApi;newDotNetNuGetDelete().WithPackage("MyLib").WithPackageVersion("1.0.0").WithSource(repoUrl).Run().EnsureSuccess();
usingHostApi;newDotNetNuGetDisableSource().WithName("TestSource").Run().EnsureSuccess();
usingHostApi;newDotNetNewDetails().WithTemplateName("CSharpInteractive.Templates").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetEnableSource().WithName("TestSource").Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadConfig().WithUpdateMode(DotNetWorkloadUpdateMode.WorkloadSet).Run().EnsureSuccess();
usingHostApi;newDotNetExec().WithPathToApplication(Path.Combine(path,"MyApp.dll")).Run().EnsureSuccess();
usingHostApi;newDotNetFormatAnalyzers().WithWorkingDirectory("MyLib").WithProject("MyLib.csproj").AddDiagnostics("CA1831","CA1832").WithSeverity(DotNetFormatSeverity.Warning).Run().EnsureSuccess();
usingHostApi;newDotNetFormatStyle().WithWorkingDirectory("MyLib").WithProject("MyLib.csproj").AddDiagnostics("IDE0005","IDE0006").WithSeverity(DotNetFormatSeverity.Information).Run().EnsureSuccess();
usingHostApi;newDotNetFormat().WithWorkingDirectory("MyLib").WithProject("MyLib.csproj").AddDiagnostics("IDE0005","IDE0006").AddIncludes(".","./tests").AddExcludes("./obj").WithSeverity(DotNetFormatSeverity.Information).Run().EnsureSuccess();
usingHostApi;string?repositoryPath=null;newDotNetNuGetConfigGet().WithConfigKey("repositoryPath").Run(output=>repositoryPath=output.Line).EnsureSuccess();
usingHostApi;newDotNetNewInstall().WithPackage("Pure.DI.Templates").Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadInstall().AddWorkloads("aspire").Run().EnsureSuccess();
usingHostApi;// Creates a local tool manifestnewDotNetNew().WithTemplateName("tool-manifest").Run().EnsureSuccess();newDotNetToolRestore().Run().EnsureSuccess();
usingHostApi;newDotNetToolInstall().WithLocal(true).WithPackage("dotnet-csi").WithVersion("1.1.2").Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadRestore().WithProject(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();
usingHostApi;varscript=Path.GetTempFileName();File.WriteAllText(script,"Console.WriteLine($\"Hello, {Args[0]}!\");");varstdOut=newList<string>();newDotNetToolRun().WithCommandName("dotnet-csi").AddArgs(script).AddArgs("World").Run(output=>stdOut.Add(output.Line)).EnsureSuccess();// Checks stdOutstdOut.Contains("Hello, World!").ShouldBeTrue();
usingHostApi;// Creates a NuGet package of version 1.2.3 for the projectnewDotNetPack().WithWorkingDirectory("MyLib").WithOutput(path).AddProps(("version","1.2.3")).Build().EnsureSuccess();
usingHostApi;newDotNetNuGetWhy().WithProject(Path.Combine("MyLib","MyLib.csproj")).WithPackage("MyLib.1.2.3.nupkg").Run().EnsureSuccess();
usingHostApi;newDotNetToolList().WithLocal(true).Run().EnsureSuccess();newDotNetToolList().WithGlobal(true).Run().EnsureSuccess();
usingHostApi;newDotNetNuGetListSource().WithFormat(NuGetListFormat.Short).Run().EnsureSuccess();
usingHostApi;varlines=newList<string>();newDotNetSlnList().WithSolution("NySolution.sln").Run(output=>lines.Add(output.Line)).EnsureSuccess();
usingHostApi;newDotNetNewList().Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadList().Run().EnsureSuccess();
usingHostApi;varconfigPaths=newList<string>();newDotNetNuGetConfigPaths().Run(output=>configPaths.Add(output.Line)).EnsureSuccess();
usingHostApi;newDotNetAddPackage().WithWorkingDirectory("MyLib").WithPackage("Pure.DI").Run().EnsureSuccess();varlines=newList<string>();newDotNetListPackage().WithProject(Path.Combine("MyLib","MyLib.csproj")).WithVerbosity(DotNetVerbosity.Minimal).Run(output=>lines.Add(output.Line));lines.Any(i=>i.Contains("Pure.DI")).ShouldBeTrue();
usingHostApi;newDotNetAddReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).WithReferences(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();varlines=newList<string>();newDotNetListReference().WithProject(Path.Combine("MyTests","MyTests.csproj")).Run(output=>lines.Add(output.Line));lines.Any(i=>i.Contains("MyLib.csproj")).ShouldBeTrue();
usingHostApi;varsdks=newList<Sdk>();newDotNetSdkCheck().Run(output=>{if(output.Line.StartsWith("Microsoft.")){vardata=output.Line.Split(' ',StringSplitOptions.RemoveEmptyEntries);if(data.Length>=2){sdks.Add(newSdk(data[0],NuGetVersion.Parse(data[1])));}}}).EnsureSuccess();sdks.Count.ShouldBeGreaterThan(0);recordSdk(stringName,NuGetVersionVersion);
usingHostApi;newDotNetNuGetLocalsList().WithCacheLocation(NuGetCacheLocation.GlobalPackages).Run().EnsureSuccess();
usingHostApi;newDotNetPublish().WithWorkingDirectory("MyLib").WithFramework(framework).WithOutput("bin").Build().EnsureSuccess();
usingHostApi;newDotNetNuGetPush().WithWorkingDirectory("MyLib").WithPackage(Path.Combine("packages","MyLib.1.0.0.nupkg")).WithSource(repoUrl).Run().EnsureSuccess();
usingHostApi;newDotNetAddPackage().WithWorkingDirectory("MyLib").WithPackage("Pure.DI").Run().EnsureSuccess();newDotNetRemovePackage().WithWorkingDirectory("MyLib").WithPackage("Pure.DI").Run().EnsureSuccess();
usingHostApi;newDotNetSlnRemove().WithSolution("NySolution.sln").AddProjects(Path.Combine("MyLib","MyLib.csproj")).Run().EnsureSuccess();
usingHostApi;newDotNetNuGetRemoveSource().WithName("TestSource").Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadRepair().Run().EnsureSuccess();
usingHostApi;newDotNetRestore().WithProject(Path.Combine("MyLib","MyLib.csproj")).Build().EnsureSuccess();
// Adds the namespace "HostApi" to use .NET build APIusingHostApi;newDotNet().WithPathToApplication(Path.Combine(path,"MyApp.dll")).Run().EnsureSuccess();
usingHostApi;// Gets the dotnet version, running a command like: "dotnet --version"NuGetVersion?version=null;newDotNetCustom("--version").Run(message=>NuGetVersion.TryParse(message.Line,outversion)).EnsureSuccess();version.ShouldNotBeNull();
usingHostApi;varstdOut=newList<string>();newDotNetRun().WithProject(Path.Combine("MyApp","MyApp.csproj")).Build(message=>stdOut.Add(message.Text)).EnsureSuccess();
usingHostApi;// Runs testsvarresult=newVSTest().AddTestFileNames(Path.Combine("bin","MyTests.dll")).WithWorkingDirectory(path).Build().EnsureSuccess();// The "result" variable provides details about build and testsresult.ExitCode.ShouldBe(0,result.ToString());result.Summary.Tests.ShouldBe(1,result.ToString());result.Tests.Count(test=>test.State==TestState.Finished).ShouldBe(1,result.ToString());
usingHostApi;newDotNetToolInstall().WithLocal(true).WithPackage("JetBrains.dotCover.GlobalTool").Run().EnsureSuccess();// Creates a test commandvartest=newDotNetTest().WithProject("MyTests");vardotCoverSnapshot=Path.Combine("MyTests","dotCover.dcvr");vardotCoverReport=Path.Combine("MyTests","dotCover.html");// Modifies the test command by putting "dotCover" in front of all arguments// to have something like "dotnet dotcover test ..."// and adding few specific arguments to the endvartestUnderDotCover=test.Customize(cmd=>cmd.ClearArgs()+"dotcover"+cmd.Args+$"--dcOutput={dotCoverSnapshot}"+"--dcFilters=+:module=TeamCity.CSharpInteractive.HostApi;+:module=dotnet-csi"+"--dcAttributeFilters=System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage");// Runs tests under dotCovervarresult=testUnderDotCover.Build().EnsureSuccess();// The "result" variable provides details about a buildresult.ExitCode.ShouldBe(0,result.ToString());result.Tests.Count(i=>i.State==TestState.Finished).ShouldBe(1,result.ToString());// Generates a HTML code coverage report.newDotNetCustom("dotCover","report",$"--source={dotCoverSnapshot}",$"--output={dotCoverReport}","--reportType=HTML").Run().EnsureSuccess();
usingHostApi;newDotNetToolSearch().WithPackage("dotnet-csi").WithDetail(true).Run().EnsureSuccess();
usingSystem.Text;usingSystem.Text.Json;usingHostApi;varpackagesJson=newStringBuilder();newDotNetPackageSearch().WithSearchTerm("Pure.DI").WithFormat(DotNetPackageSearchResultFormat.Json).Run(output=>packagesJson.AppendLine(output.Line)).EnsureSuccess();varresult=JsonSerializer.Deserialize<Result>(packagesJson.ToString(),newJsonSerializerOptions{PropertyNameCaseInsensitive=true});result.ShouldNotBeNull();result.SearchResult.SelectMany(i=>i.Packages).Count(i=>i.Id=="Pure.DI").ShouldBe(1);recordResult(intVersion,IReadOnlyCollection<Source>SearchResult);recordSource(stringSourceName,IReadOnlyCollection<Package>Packages);recordPackage(stringId,stringLatestVersion,intTotalDownloads,stringOwners);
usingHostApi;newDotNetWorkloadSearch().WithSearchString("maui").Run().EnsureSuccess();
usingHostApi;newDotNetNewSearch().WithTemplateName("build").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetConfigSet().WithConfigFile(configFile).WithConfigKey("repositoryPath").WithConfigValue("MyValue").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetSign().AddPackages("MyLib.1.2.3.nupkg").WithCertificatePath("certificate.pfx").WithCertificatePassword("Abc").WithTimestampingServer("http://timestamp.digicert.com/").Run().EnsureSuccess();
usingHostApi;newDotNetStore().AddManifests(Path.Combine("MyLib","MyLib.csproj")).WithFramework("net8.0").WithRuntime("win-x64").Build();
usingHostApi;// Runs tests via a commandvarresult=newMSBuild().WithTarget("VSTest").WithWorkingDirectory("MyTests").Build().EnsureSuccess();// The "result" variable provides details about a buildresult.ExitCode.ShouldBe(0,result.ToString());result.Summary.Tests.ShouldBe(1,result.ToString());result.Tests.Count(test=>test.State==TestState.Finished).ShouldBe(1,result.ToString());
usingHostApi;// Runs testsvarresult=newDotNetTest().WithProject("MyTests").Build().EnsureSuccess();
usingHostApi;newDotNetWorkloadUninstall().AddWorkloads("aspire").Run().EnsureSuccess();
usingHostApi;newDotNetNewUninstall().WithPackage("Pure.DI.Templates").Run();
usingHostApi;newDotNetToolUninstall().WithPackage("dotnet-csi").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetConfigUnset().WithConfigKey("repositoryPath").Run().EnsureSuccess();
usingHostApi;newDotNetNuGetUpdateSource().WithName("TestSource").WithSource(newSource).Run().EnsureSuccess();
usingHostApi;newDotNetNewUpdate().Run().EnsureSuccess();
usingHostApi;newDotNetWorkloadUpdate().Run().EnsureSuccess();
usingHostApi;newDotNetToolUpdate().WithLocal(true).WithPackage("dotnet-csi").WithVersion("1.1.2").Run().EnsureSuccess();
usingHostApi;// Create a certificate, trust it, and export it to a PEM file.newDotNetDevCertsHttps().WithExportPath("certificate.pem").WithTrust(true).WithFormat(DotNetCertificateFormat.Pem).WithPassword("Abc").Run().EnsureSuccess();
usingHostApi;varscript=Path.GetTempFileName();File.WriteAllText(script,"Console.WriteLine($\"Hello, {Args[0]}!\");");varstdOut=newList<string>();newDotNetCsi().WithScript(script).AddArgs("World").Run(output=>stdOut.Add(output.Line)).EnsureSuccess();// Checks stdOutstdOut.Contains("Hello, World!").ShouldBeTrue();
usingHostApi;// Shuts down all build servers that are started from dotnet.newDotNetBuildServerShutdown().Run().EnsureSuccess();
For more details how to use TeamCity service message API please seethis page. Instead of creating a root message writer like in the following example:
usingJetBrains.TeamCity.ServiceMessages.Write.Special;usingvarwriter=newTeamCityServiceMessages().CreateWriter(Console.WriteLine);
use this statement:
usingJetBrains.TeamCity.ServiceMessages.Write.Special;usingvarwriter=GetService<ITeamCityWriter>();
This sample opens a blockMy Tests and reports about two tests:
// Adds a namespace to use ITeamCityWriterusingJetBrains.TeamCity.ServiceMessages.Write.Special;usingvarwriter=GetService<ITeamCityWriter>();using(vartests=writer.OpenBlock("My Tests")){using(vartest=tests.OpenTest("Test1")){test.WriteStdOutput("Hello");test.WriteImage("TestsResults/Test1Screenshot.jpg","Screenshot");test.WriteDuration(TimeSpan.FromMilliseconds(10));}using(vartest=tests.OpenTest("Test2")){test.WriteIgnored("Some reason");}}
For more information on TeamCity Service Messages, seethis page.
About
Build automation system for .NET