Control everything: Visual Studio, MSBuild Tools, CI, and more …
🎛 Event-Catcher with variety of advanced Actions to service projects, libraries, build processes, runtime environment of the Visual Studio, MSBuild Tools, and …
Copyright (c) 2013-2024 Denis Kuzmin <x-3F@outlook.com> github/3F
Advanced handler of the most events from MS Visual Studio & MSBuild tools. Full control and flexible multi-actions for basic pre/post events and other additional such as:
- CommandEvent, Errors, Warnings, Cancel-Build, Output-Build, Transmitter, Logging
Ability to handle events for all subprojects at once from the whole solution as an Solution-Events or individually for each separately.
Various modes for everything:
- Files Mode, Operation Mode, Interpreter Mode, Script Mode, Targets Mode, C# Mode
Supports Advanced MSBuild & SBE-Scripts engine for your awesome ideas.
Provides CI support (TeamCity, AppVeyor, Azure DevOps, ...), Command-Line mode and lot of other features for convenient work with the builds, tests, versioning, IO operations, and so on. See the documentation.
- SBE-Scripts
- E-MSBuild
- Examples - scripts, solutions, syntax etc.,
- Continuous Integration (CI)
- Processing modes
- API
- Install & Build (Developer Zone)
- Wiki - read or edit
Through E-MSBuild engine.
#[$(
[System.Math]::Exp('$(
[MSBuild]::Multiply(
$([System.Math]::Log(10)),
4
))'
)
)]
$(n = 0) $(desc = "Hello ")
$(n += 3.14) $(desc += "from vsSBE !")
$(n += $(n)) $(p1 = " Platform is $(Platform)")
$(...)
$(...:project) - from selected project in your solution
$$(...) ... $$(...:project)
$(tStart = $([System.DateTime]::Parse("2014/01/01").ToBinary()))
$([System.Guid]::NewGuid())
$([System.TimeSpan]::FromTicks($([MSBuild]::Subtract($(tNow), $(tStart))))
.TotalHours.ToString("0"))
$(pdir = $(ProjectDir:project))
$(pdir = $(ProjectDir.Replace('\', '/'):project))
https://github.com/3F/SobaScript -- Extensible Modular Scripting Programming Language.
#["
#SobaScript in action
"]
just a regular text between
#[$(v = 1.2.3)]
#[$(log = "$(TMP)/v.txt")]
#[($(Configuration) ~= Deb || true)
{
#[var tBase = $([System.DateTime]::Parse('2019/08/01').ToBinary())]
#[var tNow = $([System.DateTime]::UtcNow.Ticks)]
#[var revBuild = #[$(
[System.TimeSpan]::FromTicks('$(
[MSBuild]::Subtract(
$(tNow),
$(tBase))
)')
.TotalMinutes
.ToString('0')
)]]
#[var v = $(v).$([MSBuild]::Modulo($(revBuild), $([System.Math]::Pow(2, 14))))]
}]
#[var v = $([System.String]::Format("v{0}\r\n\t", $(v)))]
#[try
{
#[File write("#[var log]"):> Example #[var v] Generated by a vsSolutionBuildEvent]
#[IO scall("notepad", "#[var log]")]
}
catch(err, msg)
{
$(err) - Type of Exception
$(msg) - Error Message
}]
#[Box iterate(i = 0; $(loop); i += 1): #[try
{
...
}
catch { $(loop = false) }] ]
For example, you can exclude projects from build at runtime:
#[Build projects.find("name").IsBuildable = false]
Capture data from external utilities:
#[var bSha1 = #[IO sout("git", "rev-parse --short HEAD")]]
Do callable actions with arguments:
#[$(shaListDir = $(dbin))] #[$(searchSubDirs = '0')]
#[Core events.Post.item("ShaList").run()]
Work with files and archives:
#[IO copy.file("$(odir)/notes.txt", "$(pDirCIM)bin\\$(cfg)\\", true)]
#[7z pack.files({
"$(pDirBridge)bin\$(cfg)\Bridge.*.*",
"CI.MSBuild.dll",
"CI.MSBuild.pdb",
"$(pDirCIM)bin\$(cfg)\*.txt"}, "$(odir)CI.MSBuild_v$(numCIM)_[$(branchSha1)][$(netStamp)].zip")]
+DTE-commands, +Access to all MSBuild properties on the fly, +Conditional statements and lot of other components:
#[try
{
#[Box iterate(i = 0; $(i) < 10; i += 1):
...
]
}catch{ }]
#[( #[vsSBE events.Pre.item(1).Enabled] || ($(Configuration) == "Release" && $(sysc)) )
{
#[Build projects.find("name").IsBuildable = false]
}
else
{
#[var bSha1 = #[IO sout("git", "rev-parse --short HEAD")]]
...
}]
https://3F.github.io/web.vsSBE/doc/Modes/
From simple commands to C# or even msbuild targets:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Init">
<!-- ... -->
</Target>
<!--
Additional properties:
$(ActionName)
$(BuildType)
$(EventType)
$(SupportMSBuild)
$(SupportSBEScripts)
$(SolutionActiveCfg)
$(StartupProject)
-->
</Project>
You can also use this to catch all command from VS IDE. Samples:
$(lcGuid = #[DTE events.LastCommand.Guid])
$(lcId = #[DTE events.LastCommand.Id])
#[($(lcGuid) == "{1496A755-94DE-11D0-8C3F-00C04FC2AAE2}" && $(lcId) == 1627) {
#[File scall("notepad", "#[var log]", 30)]
}]
See our Wizard for automatic code generation or use any custom scripts.
You can easily use this with TeamCity, Azure DevOps, AppVeyor, and any other automated environments:
...
Pre-Build / Post-Build events for all projects at once or individually for each separately: configure what you need.
Immediately stop (at the same time) after the first appearance (compared with StopOnFirstBuildError plugin [?])
Wiki - Examples, syntax, developer zone, and other ...
Feel free to improve any pages. Click [Edit] button or Start new here.
[. . .]