Savorboard
6 years ago
11 changed files with 491 additions and 8 deletions
@ -0,0 +1,18 @@ |
|||||
|
<Project> |
||||
|
|
||||
|
<Import Project="build\version.props" /> |
||||
|
|
||||
|
<PropertyGroup Label="Package"> |
||||
|
<Product>NPOI</Product> |
||||
|
<Authors>.NET Core Community;Savorboard</Authors> |
||||
|
<RepositoryUrl>https://github.com/dotnetcore/NPOI</RepositoryUrl> |
||||
|
<RepositoryType>git</RepositoryType> |
||||
|
<RepositoryRoot>$(MSBuildThisFileDirectory)</RepositoryRoot> |
||||
|
<PackageIconUrl>https://avatars2.githubusercontent.com/u/19404084</PackageIconUrl> |
||||
|
<PackageProjectUrl>https://github.com/dotnetcore/NPOI</PackageProjectUrl> |
||||
|
<PackageLicenseUrl>https://github.com/dotnetcore/NPOI/blob/master/LICENSE.txt</PackageLicenseUrl> |
||||
|
<PackageTags>NPOI,Office,Excel,Word</PackageTags> |
||||
|
<Description>A .NET library for reading and writing Microsoft Office binary and OOXML file formats.</Description> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
</Project> |
@ -0,0 +1,14 @@ |
|||||
|
version: '{build}' |
||||
|
os: Visual Studio 2017 |
||||
|
branches: |
||||
|
only: |
||||
|
- master |
||||
|
environment: |
||||
|
BUILDING_ON_PLATFORM: win |
||||
|
BuildEnvironment: appveyor |
||||
|
skip_commits: |
||||
|
files: |
||||
|
- LICENSE |
||||
|
build_script: |
||||
|
- ps: ./build.ps1 |
||||
|
test: off |
@ -0,0 +1,101 @@ |
|||||
|
#addin "nuget:https://www.nuget.org/api/v2?package=Newtonsoft.Json&version=9.0.1" |
||||
|
|
||||
|
#load "./build/index.cake" |
||||
|
|
||||
|
var target = Argument("target", "Default"); |
||||
|
|
||||
|
var build = BuildParameters.Create(Context); |
||||
|
var util = new Util(Context, build); |
||||
|
|
||||
|
Task("Clean") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
if (DirectoryExists("./artifacts")) |
||||
|
{ |
||||
|
DeleteDirectory("./artifacts", true); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
Task("Restore") |
||||
|
.IsDependentOn("Clean") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
var settings = new DotNetCoreRestoreSettings |
||||
|
{ |
||||
|
ArgumentCustomization = args => |
||||
|
{ |
||||
|
args.Append($"/p:VersionSuffix={build.Version.Suffix}"); |
||||
|
return args; |
||||
|
} |
||||
|
}; |
||||
|
DotNetCoreRestore(settings); |
||||
|
}); |
||||
|
|
||||
|
Task("Build") |
||||
|
.IsDependentOn("Restore") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
var settings = new DotNetCoreBuildSettings |
||||
|
{ |
||||
|
Configuration = build.Configuration, |
||||
|
VersionSuffix = build.Version.Suffix, |
||||
|
ArgumentCustomization = args => |
||||
|
{ |
||||
|
args.Append($"/p:InformationalVersion={build.Version.VersionWithSuffix()}"); |
||||
|
return args; |
||||
|
} |
||||
|
}; |
||||
|
foreach (var project in build.ProjectFiles) |
||||
|
{ |
||||
|
DotNetCoreBuild(project.FullPath, settings); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
Task("Test") |
||||
|
.IsDependentOn("Build") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
foreach (var testProject in build.TestProjectFiles) |
||||
|
{ |
||||
|
DotNetCoreTest(testProject.FullPath); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
Task("Pack") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
var settings = new DotNetCorePackSettings |
||||
|
{ |
||||
|
Configuration = build.Configuration, |
||||
|
VersionSuffix = build.Version.Suffix, |
||||
|
IncludeSymbols = true, |
||||
|
OutputDirectory = "./artifacts/packages" |
||||
|
}; |
||||
|
foreach (var project in build.ProjectFiles) |
||||
|
{ |
||||
|
//DotNetCorePack(project.FullPath, settings); |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
Task("Default") |
||||
|
.IsDependentOn("Build") |
||||
|
.IsDependentOn("Test") |
||||
|
.IsDependentOn("Pack") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
util.PrintInfo(); |
||||
|
}); |
||||
|
|
||||
|
Task("Version") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
Information($"{build.FullVersion()}"); |
||||
|
}); |
||||
|
|
||||
|
Task("Print") |
||||
|
.Does(() => |
||||
|
{ |
||||
|
util.PrintInfo(); |
||||
|
}); |
||||
|
|
||||
|
RunTarget(target); |
@ -0,0 +1,183 @@ |
|||||
|
<# |
||||
|
|
||||
|
.SYNOPSIS |
||||
|
This is a Powershell script to bootstrap a Cake build. |
||||
|
|
||||
|
.DESCRIPTION |
||||
|
This Powershell script will download NuGet if missing, restore NuGet tools (including Cake) |
||||
|
and execute your Cake build script with the parameters you provide. |
||||
|
|
||||
|
.PARAMETER Script |
||||
|
The build script to execute. |
||||
|
.PARAMETER Target |
||||
|
The build script target to run. |
||||
|
.PARAMETER Configuration |
||||
|
The build configuration to use. |
||||
|
.PARAMETER Verbosity |
||||
|
Specifies the amount of information to be displayed. |
||||
|
.PARAMETER Experimental |
||||
|
Tells Cake to use the latest Roslyn release. |
||||
|
.PARAMETER WhatIf |
||||
|
Performs a dry run of the build script. |
||||
|
No tasks will be executed. |
||||
|
.PARAMETER Mono |
||||
|
Tells Cake to use the Mono scripting engine. |
||||
|
.PARAMETER SkipToolPackageRestore |
||||
|
Skips restoring of packages. |
||||
|
.PARAMETER ScriptArgs |
||||
|
Remaining arguments are added here. |
||||
|
|
||||
|
.LINK |
||||
|
http://cakebuild.net |
||||
|
|
||||
|
#> |
||||
|
|
||||
|
[CmdletBinding()] |
||||
|
Param( |
||||
|
[string]$Script = "build.cake", |
||||
|
[string]$Target = "Default", |
||||
|
[ValidateSet("Release", "Debug")] |
||||
|
[string]$Configuration = "Debug", |
||||
|
[ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")] |
||||
|
[string]$Verbosity = "Normal", |
||||
|
[switch]$Experimental = $true, |
||||
|
[Alias("DryRun","Noop")] |
||||
|
[switch]$WhatIf, |
||||
|
[switch]$Mono, |
||||
|
[switch]$SkipToolPackageRestore, |
||||
|
[Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)] |
||||
|
[string[]]$ScriptArgs |
||||
|
) |
||||
|
|
||||
|
[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null |
||||
|
function MD5HashFile([string] $filePath) |
||||
|
{ |
||||
|
if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf)) |
||||
|
{ |
||||
|
return $null |
||||
|
} |
||||
|
|
||||
|
[System.IO.Stream] $file = $null; |
||||
|
[System.Security.Cryptography.MD5] $md5 = $null; |
||||
|
try |
||||
|
{ |
||||
|
$md5 = [System.Security.Cryptography.MD5]::Create() |
||||
|
$file = [System.IO.File]::OpenRead($filePath) |
||||
|
return [System.BitConverter]::ToString($md5.ComputeHash($file)) |
||||
|
} |
||||
|
finally |
||||
|
{ |
||||
|
if ($file -ne $null) |
||||
|
{ |
||||
|
$file.Dispose() |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Write-Host "Preparing to run build script..." |
||||
|
|
||||
|
if(!$PSScriptRoot){ |
||||
|
$PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent |
||||
|
} |
||||
|
|
||||
|
$TOOLS_DIR = Join-Path $PSScriptRoot "tools" |
||||
|
$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe" |
||||
|
$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe" |
||||
|
$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" |
||||
|
$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config" |
||||
|
$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum" |
||||
|
|
||||
|
# Should we use mono? |
||||
|
$UseMono = ""; |
||||
|
if($Mono.IsPresent) { |
||||
|
Write-Verbose -Message "Using the Mono based scripting engine." |
||||
|
$UseMono = "-mono" |
||||
|
} |
||||
|
|
||||
|
# Should we use the new Roslyn? |
||||
|
$UseExperimental = ""; |
||||
|
if($Experimental.IsPresent -and !($Mono.IsPresent)) { |
||||
|
Write-Verbose -Message "Using experimental version of Roslyn." |
||||
|
$UseExperimental = "-experimental" |
||||
|
} |
||||
|
|
||||
|
# Is this a dry run? |
||||
|
$UseDryRun = ""; |
||||
|
if($WhatIf.IsPresent) { |
||||
|
$UseDryRun = "-dryrun" |
||||
|
} |
||||
|
|
||||
|
# Make sure tools folder exists |
||||
|
if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) { |
||||
|
Write-Verbose -Message "Creating tools directory..." |
||||
|
New-Item -Path $TOOLS_DIR -Type directory | out-null |
||||
|
} |
||||
|
|
||||
|
# Make sure that packages.config exist. |
||||
|
if (!(Test-Path $PACKAGES_CONFIG)) { |
||||
|
Write-Verbose -Message "Downloading packages.config..." |
||||
|
try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch { |
||||
|
Throw "Could not download packages.config." |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Try find NuGet.exe in path if not exists |
||||
|
if (!(Test-Path $NUGET_EXE)) { |
||||
|
Write-Verbose -Message "Trying to find nuget.exe in PATH..." |
||||
|
$existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) } |
||||
|
$NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1 |
||||
|
if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) { |
||||
|
Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)." |
||||
|
$NUGET_EXE = $NUGET_EXE_IN_PATH.FullName |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Try download NuGet.exe if not exists |
||||
|
if (!(Test-Path $NUGET_EXE)) { |
||||
|
Write-Verbose -Message "Downloading NuGet.exe..." |
||||
|
try { |
||||
|
(New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE) |
||||
|
} catch { |
||||
|
Throw "Could not download NuGet.exe." |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# Save nuget.exe path to environment to be available to child processed |
||||
|
$ENV:NUGET_EXE = $NUGET_EXE |
||||
|
|
||||
|
# Restore tools from NuGet? |
||||
|
if(-Not $SkipToolPackageRestore.IsPresent) { |
||||
|
Push-Location |
||||
|
Set-Location $TOOLS_DIR |
||||
|
|
||||
|
# Check for changes in packages.config and remove installed tools if true. |
||||
|
[string] $md5Hash = MD5HashFile($PACKAGES_CONFIG) |
||||
|
if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or |
||||
|
($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) { |
||||
|
Write-Verbose -Message "Missing or changed package.config hash..." |
||||
|
Remove-Item * -Recurse -Exclude packages.config,nuget.exe |
||||
|
} |
||||
|
|
||||
|
Write-Verbose -Message "Restoring tools from NuGet..." |
||||
|
$NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`"" |
||||
|
|
||||
|
if ($LASTEXITCODE -ne 0) { |
||||
|
Throw "An error occured while restoring NuGet tools." |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
$md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII" |
||||
|
} |
||||
|
Write-Verbose -Message ($NuGetOutput | out-string) |
||||
|
Pop-Location |
||||
|
} |
||||
|
|
||||
|
# Make sure that Cake has been installed. |
||||
|
if (!(Test-Path $CAKE_EXE)) { |
||||
|
Throw "Could not find Cake.exe at $CAKE_EXE" |
||||
|
} |
||||
|
|
||||
|
# Start Cake |
||||
|
Write-Host "Running build script..." |
||||
|
Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs" |
||||
|
exit $LASTEXITCODE |
@ -0,0 +1,2 @@ |
|||||
|
#load "./util.cake" |
||||
|
#load "./version.cake" |
@ -0,0 +1,25 @@ |
|||||
|
public class Util |
||||
|
{ |
||||
|
public Util(ICakeContext context, BuildParameters build) |
||||
|
{ |
||||
|
Context = context; |
||||
|
Build = build; |
||||
|
} |
||||
|
|
||||
|
public ICakeContext Context { get; set; } |
||||
|
public BuildParameters Build { get; set; } |
||||
|
|
||||
|
public void PrintInfo() |
||||
|
{ |
||||
|
Context.Information($@" |
||||
|
Version: {Build.FullVersion()} |
||||
|
Configuration: {Build.Configuration} |
||||
|
"); |
||||
|
} |
||||
|
|
||||
|
public static string CreateStamp() |
||||
|
{ |
||||
|
var seconds = (long)(DateTime.UtcNow - new DateTime(2017, 1, 1)).TotalSeconds; |
||||
|
return seconds.ToString(); |
||||
|
} |
||||
|
} |
@ -0,0 +1,120 @@ |
|||||
|
using System.Xml; |
||||
|
|
||||
|
public class BuildParameters |
||||
|
{ |
||||
|
public BuildParameters(ICakeContext context) |
||||
|
{ |
||||
|
Context = context; |
||||
|
} |
||||
|
|
||||
|
public ICakeContext Context { get; } |
||||
|
public BuildVersion Version { get; private set; } |
||||
|
public string Configuration { get; private set; } |
||||
|
public bool IsTagged { get; private set; } |
||||
|
public bool IsCI { get; private set; } |
||||
|
public DirectoryPathCollection Projects { get; set; } |
||||
|
public DirectoryPathCollection TestProjects { get; set; } |
||||
|
public FilePathCollection ProjectFiles { get; set; } |
||||
|
public FilePathCollection TestProjectFiles { get; set; } |
||||
|
|
||||
|
public static BuildParameters Create(ICakeContext context) |
||||
|
{ |
||||
|
var buildParameters = new BuildParameters(context); |
||||
|
buildParameters.Initialize(); |
||||
|
return buildParameters; |
||||
|
} |
||||
|
|
||||
|
public string FullVersion() |
||||
|
{ |
||||
|
return Version.VersionWithSuffix(); |
||||
|
} |
||||
|
|
||||
|
private void Initialize() |
||||
|
{ |
||||
|
InitializeCore(); |
||||
|
InitializeVersion(); |
||||
|
} |
||||
|
|
||||
|
private void InitializeCore() |
||||
|
{ |
||||
|
Projects = Context.GetDirectories("./src/*"); |
||||
|
TestProjects = Context.GetDirectories("./test/*"); |
||||
|
ProjectFiles = Context.GetFiles("./src/*/*.csproj"); |
||||
|
TestProjectFiles = Context.GetFiles("./test/*/*.csproj"); |
||||
|
|
||||
|
var buildSystem = Context.BuildSystem(); |
||||
|
if (!buildSystem.IsLocalBuild) |
||||
|
{ |
||||
|
IsCI = true; |
||||
|
if ((buildSystem.IsRunningOnAppVeyor && buildSystem.AppVeyor.Environment.Repository.Tag.IsTag) || |
||||
|
(buildSystem.IsRunningOnTravisCI && string.IsNullOrWhiteSpace(buildSystem.TravisCI.Environment.Build.Tag))) |
||||
|
{ |
||||
|
IsTagged = true; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
Configuration = Context.Argument("Configuration", "Debug"); |
||||
|
if (IsCI) |
||||
|
{ |
||||
|
Configuration = "Release"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void InitializeVersion() |
||||
|
{ |
||||
|
var versionFile = Context.File("./build/version.props"); |
||||
|
var content = System.IO.File.ReadAllText(versionFile.Path.FullPath); |
||||
|
|
||||
|
XmlDocument doc = new XmlDocument(); |
||||
|
doc.LoadXml(content); |
||||
|
|
||||
|
var versionMajor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMajor").InnerText; |
||||
|
var versionMinor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMinor").InnerText; |
||||
|
var versionPatch = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionPatch").InnerText; |
||||
|
var versionQuality = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionQuality").InnerText; |
||||
|
versionQuality = string.IsNullOrWhiteSpace(versionQuality) ? null : versionQuality; |
||||
|
|
||||
|
var suffix = versionQuality; |
||||
|
if (!IsTagged) |
||||
|
{ |
||||
|
suffix += (IsCI ? "preview-" : "dev-") + Util.CreateStamp(); |
||||
|
} |
||||
|
suffix = string.IsNullOrWhiteSpace(suffix) ? null : suffix; |
||||
|
|
||||
|
Version = |
||||
|
new BuildVersion(int.Parse(versionMajor), int.Parse(versionMinor), int.Parse(versionPatch), versionQuality); |
||||
|
Version.Suffix = suffix; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public class BuildVersion |
||||
|
{ |
||||
|
public BuildVersion(int major, int minor, int patch, string quality) |
||||
|
{ |
||||
|
Major = major; |
||||
|
Minor = minor; |
||||
|
Patch = patch; |
||||
|
Quality = quality; |
||||
|
} |
||||
|
|
||||
|
public int Major { get; set; } |
||||
|
public int Minor { get; set; } |
||||
|
public int Patch { get; set; } |
||||
|
public string Quality { get; set; } |
||||
|
public string Suffix { get; set; } |
||||
|
|
||||
|
public string VersionWithoutQuality() |
||||
|
{ |
||||
|
return $"{Major}.{Minor}.{Patch}"; |
||||
|
} |
||||
|
|
||||
|
public string Version() |
||||
|
{ |
||||
|
return VersionWithoutQuality() + (Quality == null ? string.Empty : $"-{Quality}"); |
||||
|
} |
||||
|
|
||||
|
public string VersionWithSuffix() |
||||
|
{ |
||||
|
return Version() + (Suffix == null ? string.Empty : $"-{Suffix}"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,9 @@ |
|||||
|
<Project> |
||||
|
<PropertyGroup> |
||||
|
<VersionMajor>1</VersionMajor> |
||||
|
<VersionMinor>2</VersionMinor> |
||||
|
<VersionPatch>0</VersionPatch> |
||||
|
<VersionQuality></VersionQuality> |
||||
|
<VersionPrefix>$(VersionMajor).$(VersionMinor).$(VersionPatch)</VersionPrefix> |
||||
|
</PropertyGroup> |
||||
|
</Project> |
@ -1,13 +1,14 @@ |
|||||
<Project Sdk="Microsoft.NET.Sdk"> |
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
<PropertyGroup> |
<PropertyGroup> |
||||
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks> |
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks> |
||||
</PropertyGroup> |
<PackageId>DotNetCore.NPOI</PackageId> |
||||
|
</PropertyGroup> |
||||
|
|
||||
<ItemGroup> |
<ItemGroup> |
||||
<ProjectReference Include="..\NPOI.OpenXml4Net\NPOI.OpenXml4Net.csproj" /> |
<ProjectReference Include="..\NPOI.OpenXml4Net\NPOI.OpenXml4Net.csproj" /> |
||||
<ProjectReference Include="..\NPOI.OpenXmlFormats\NPOI.OpenXmlFormats.csproj" /> |
<ProjectReference Include="..\NPOI.OpenXmlFormats\NPOI.OpenXmlFormats.csproj" /> |
||||
<ProjectReference Include="..\NPOI\NPOI.csproj" /> |
<ProjectReference Include="..\NPOI\NPOI.csproj" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
|
|
||||
</Project> |
</Project> |
||||
|
Loading…
Reference in new issue