Merge branch 'rel/2.0.2' into dev
This commit is contained in:
Коммит
3ab1a7033f
|
@ -16,9 +16,11 @@ This project is part of ASP.NET Core. You can find samples, documentation and ge
|
||||||
Channel | Latest Build
|
Channel | Latest Build
|
||||||
-------------|----------------
|
-------------|----------------
|
||||||
dev | ![badge][dev-badge]
|
dev | ![badge][dev-badge]
|
||||||
|
rel/2.0.2 | ![badge][rel-2.0.2-badge]
|
||||||
rel/2.0.0 | ![badge][rel-2.0.0-badge]
|
rel/2.0.0 | ![badge][rel-2.0.0-badge]
|
||||||
|
|
||||||
[dev-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/dev/badge.svg
|
[dev-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/dev/badge.svg
|
||||||
|
[rel-2.0.2-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/rel/2.0.2/badge.svg
|
||||||
[rel-2.0.0-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/rel/2.0.0/badge.svg
|
[rel-2.0.0-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/rel/2.0.0/badge.svg
|
||||||
|
|
||||||
This tool contains build scripts, console tools, MSBuild targets, and other settings required to build ASP.NET Core.
|
This tool contains build scripts, console tools, MSBuild targets, and other settings required to build ASP.NET Core.
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<_KoreBuildIntermediateDir>$(IntermediateDir)korebuild\</_KoreBuildIntermediateDir>
|
<_KoreBuildIntermediateDir>$(IntermediateDir)korebuild\</_KoreBuildIntermediateDir>
|
||||||
|
<_KoreBuildIntermediateDir>$([MSBuild]::NormalizeDirectory($(_KoreBuildIntermediateDir)))</_KoreBuildIntermediateDir>
|
||||||
<_KoreBuildOutDir>$(ArtifactsDir)korebuild\artifacts\$(Version)\</_KoreBuildOutDir>
|
<_KoreBuildOutDir>$(ArtifactsDir)korebuild\artifacts\$(Version)\</_KoreBuildOutDir>
|
||||||
<_ChannelOutDir>$(ArtifactsDir)korebuild\channels\$(KoreBuildChannel)\</_ChannelOutDir>
|
<_ChannelOutDir>$(ArtifactsDir)korebuild\channels\$(KoreBuildChannel)\</_ChannelOutDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
|
@ -9,8 +9,10 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\shared\Utilities\MSBuildListSplitter.cs" />
|
||||||
<Compile Include="..\..\modules\BuildTools.Tasks\Utilities\**" />
|
<Compile Include="..\..\modules\BuildTools.Tasks\Utilities\**" />
|
||||||
<Compile Include="..\..\modules\BuildTools.Tasks\GetGitCommitInfo.cs" />
|
<Compile Include="..\..\modules\BuildTools.Tasks\GetGitCommitInfo.cs" />
|
||||||
|
<Compile Include="..\..\modules\BuildTools.Tasks\GenerateFileFromTemplate.cs" />
|
||||||
<Compile Include="..\..\modules\BuildTools.Tasks\ZipArchive.cs" />
|
<Compile Include="..\..\modules\BuildTools.Tasks\ZipArchive.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.GetGitCommitInfo" AssemblyFile="$(_RepoTaskAssembly)" />
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.GetGitCommitInfo" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.GenerateFileFromTemplate" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.ZipArchive" AssemblyFile="$(_RepoTaskAssembly)" />
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.ZipArchive" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
<UsingTask TaskName="RepoTasks.GenerateBadge" AssemblyFile="$(_RepoTaskAssembly)" />
|
<UsingTask TaskName="RepoTasks.GenerateBadge" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -32,11 +32,11 @@ Default layout and configuration.
|
||||||
<Configuration Condition="'$(CI)' == 'true'">Release</Configuration>
|
<Configuration Condition="'$(CI)' == 'true'">Release</Configuration>
|
||||||
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
|
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
|
||||||
<SolutionProperties>$(SolutionProperties);Configuration=$(Configuration)</SolutionProperties>
|
<SolutionProperties>$(SolutionProperties);Configuration=$(Configuration)</SolutionProperties>
|
||||||
<RepositoryRoot Condition="'$(RepositoryRoot)' == ''">$(MSBuildStartupDirectory)..\..\</RepositoryRoot>
|
<RepositoryRoot Condition="'$(RepositoryRoot)' == ''">$(MSBuildStartupDirectory)</RepositoryRoot>
|
||||||
<RepositoryRoot>$([MSBuild]::EnsureTrailingSlash('$(RepositoryRoot)'))</RepositoryRoot>
|
<RepositoryRoot>$([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))</RepositoryRoot>
|
||||||
<ArtifactsDir>$(RepositoryRoot)artifacts\</ArtifactsDir>
|
<ArtifactsDir>$([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))artifacts\</ArtifactsDir>
|
||||||
<BuildDir>$(ArtifactsDir)build\</BuildDir>
|
<BuildDir>$(ArtifactsDir)build\</BuildDir>
|
||||||
<IntermediateDir>$(RepositoryRoot)obj\</IntermediateDir>
|
<IntermediateDir>$([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))obj\</IntermediateDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<!-- Use build number from CI if available -->
|
<!-- Use build number from CI if available -->
|
||||||
|
|
|
@ -12,6 +12,24 @@ if (Get-Command 'dotnet' -ErrorAction Ignore) {
|
||||||
Set-Variable 'IS_WINDOWS' -Scope Script -Option Constant -Value $((Get-Variable -Name IsWindows -ValueOnly -ErrorAction Ignore) -or !(Get-Variable -Name IsCoreClr -ValueOnly -ErrorAction Ignore))
|
Set-Variable 'IS_WINDOWS' -Scope Script -Option Constant -Value $((Get-Variable -Name IsWindows -ValueOnly -ErrorAction Ignore) -or !(Get-Variable -Name IsCoreClr -ValueOnly -ErrorAction Ignore))
|
||||||
Set-Variable 'EXE_EXT' -Scope Script -Option Constant -Value $(if ($IS_WINDOWS) { '.exe' } else { '' })
|
Set-Variable 'EXE_EXT' -Scope Script -Option Constant -Value $(if ($IS_WINDOWS) { '.exe' } else { '' })
|
||||||
|
|
||||||
|
### setup config
|
||||||
|
|
||||||
|
$script:config = @{
|
||||||
|
'dotnet.feed.cdn' = 'https://dotnetcli.azureedge.net/dotnet'
|
||||||
|
'dotnet.feed.uncached' = 'https://dotnetcli.blob.core.windows.net/dotnet'
|
||||||
|
'dotnet.feed.credential' = $null
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($env:KOREBUILD_DOTNET_FEED_CDN) {
|
||||||
|
$script:config.'dotnet.feed.cdn' = $env:KOREBUILD_DOTNET_FEED_CDN
|
||||||
|
}
|
||||||
|
if ($env:KOREBUILD_DOTNET_FEED_UNCACHED) {
|
||||||
|
$script:config.'dotnet.feed.uncached' = $env:KOREBUILD_DOTNET_FEED_UNCACHED
|
||||||
|
}
|
||||||
|
if ($env:KOREBUILD_DOTNET_FEED_CREDENTIAL) {
|
||||||
|
$script:config.'dotnet.feed.credential' = $env:KOREBUILD_DOTNET_FEED_CREDENTIAL
|
||||||
|
}
|
||||||
|
|
||||||
<#
|
<#
|
||||||
.SYNOPSIS
|
.SYNOPSIS
|
||||||
Builds a repository
|
Builds a repository
|
||||||
|
@ -195,7 +213,10 @@ function Install-Tools(
|
||||||
-Channel $channel `
|
-Channel $channel `
|
||||||
-Version $version `
|
-Version $version `
|
||||||
-Architecture $arch `
|
-Architecture $arch `
|
||||||
-InstallDir $installDir
|
-InstallDir $installDir `
|
||||||
|
-AzureFeed $script:config.'dotnet.feed.cdn' `
|
||||||
|
-UncachedFeed $script:config.'dotnet.feed.uncached' `
|
||||||
|
-FeedCredential $script:config.'dotnet.feed.credential'
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation."
|
Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation."
|
||||||
|
@ -479,7 +500,10 @@ function __install_shared_runtime($installScript, $installDir, [string]$arch, [s
|
||||||
-SharedRuntime `
|
-SharedRuntime `
|
||||||
-Version $version `
|
-Version $version `
|
||||||
-Architecture $arch `
|
-Architecture $arch `
|
||||||
-InstallDir $installDir
|
-InstallDir $installDir `
|
||||||
|
-AzureFeed $script:config.'dotnet.feed.cdn' `
|
||||||
|
-UncachedFeed $script:config.'dotnet.feed.uncached' `
|
||||||
|
-FeedCredential $script:config.'dotnet.feed.credential'
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Write-Host -ForegroundColor DarkGray ".NET Core runtime $version is already installed. Skipping installation."
|
Write-Host -ForegroundColor DarkGray ".NET Core runtime $version is already installed. Skipping installation."
|
||||||
|
|
|
@ -49,10 +49,13 @@
|
||||||
.PARAMETER AzureFeed
|
.PARAMETER AzureFeed
|
||||||
Default: https://dotnetcli.azureedge.net/dotnet
|
Default: https://dotnetcli.azureedge.net/dotnet
|
||||||
This parameter typically is not changed by the user.
|
This parameter typically is not changed by the user.
|
||||||
It allows to change URL for the Azure feed used by this installer.
|
It allows changing the URL for the Azure feed used by this installer.
|
||||||
.PARAMETER UncachedFeed
|
.PARAMETER UncachedFeed
|
||||||
This parameter typically is not changed by the user.
|
This parameter typically is not changed by the user.
|
||||||
It allows to change URL for the Uncached feed used by this installer.
|
It allows changing the URL for the Uncached feed used by this installer.
|
||||||
|
.PARAMETER FeedCredential
|
||||||
|
Used as a query string to append to the Azure feed.
|
||||||
|
It allows changing the URL to use non-public blob storage accounts.
|
||||||
.PARAMETER ProxyAddress
|
.PARAMETER ProxyAddress
|
||||||
If set, the installer will use the proxy when making web requests
|
If set, the installer will use the proxy when making web requests
|
||||||
.PARAMETER ProxyUseDefaultCredentials
|
.PARAMETER ProxyUseDefaultCredentials
|
||||||
|
@ -73,6 +76,7 @@ param(
|
||||||
[switch]$NoPath,
|
[switch]$NoPath,
|
||||||
[string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet",
|
[string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet",
|
||||||
[string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet",
|
[string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet",
|
||||||
|
[string]$FeedCredential,
|
||||||
[string]$ProxyAddress,
|
[string]$ProxyAddress,
|
||||||
[switch]$ProxyUseDefaultCredentials,
|
[switch]$ProxyUseDefaultCredentials,
|
||||||
[switch]$SkipNonVersionedFiles
|
[switch]$SkipNonVersionedFiles
|
||||||
|
@ -193,9 +197,11 @@ function GetHTTPResponse([Uri] $Uri)
|
||||||
# Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out
|
# Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out
|
||||||
# 10 minutes allows it to work over much slower connections.
|
# 10 minutes allows it to work over much slower connections.
|
||||||
$HttpClient.Timeout = New-TimeSpan -Minutes 10
|
$HttpClient.Timeout = New-TimeSpan -Minutes 10
|
||||||
$Response = $HttpClient.GetAsync($Uri).Result
|
$ActualUri = if (($Uri -like "$AzureFeed*") -or ($Uri -like "$UncachedFeed*")) { "${Uri}${FeedCredential}" } else { $Uri }
|
||||||
|
$Response = $HttpClient.GetAsync($ActualUri).Result
|
||||||
if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode)))
|
if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode)))
|
||||||
{
|
{
|
||||||
|
# The feed credential is potential sensitive info. Do not log it to console output.
|
||||||
$ErrorMsg = "Failed to download $Uri."
|
$ErrorMsg = "Failed to download $Uri."
|
||||||
if ($Response -ne $null)
|
if ($Response -ne $null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -580,6 +580,11 @@ downloadcurl() {
|
||||||
local remote_path=$1
|
local remote_path=$1
|
||||||
local out_path=${2:-}
|
local out_path=${2:-}
|
||||||
|
|
||||||
|
# Append feed_credential as late as possible before calling curl to avoid logging feed_credential
|
||||||
|
if [[ "$remote_path" == "$azure_feed"* ]] || [[ "$remote_path" == "$uncached_feed"* ]]; then
|
||||||
|
remote_path="${remote_path}${feed_credential}"
|
||||||
|
fi
|
||||||
|
|
||||||
local failed=false
|
local failed=false
|
||||||
if [ -z "$out_path" ]; then
|
if [ -z "$out_path" ]; then
|
||||||
curl --retry 10 -sSL -f --create-dirs $remote_path || failed=true
|
curl --retry 10 -sSL -f --create-dirs $remote_path || failed=true
|
||||||
|
@ -598,6 +603,11 @@ downloadwget() {
|
||||||
local remote_path=$1
|
local remote_path=$1
|
||||||
local out_path=${2:-}
|
local out_path=${2:-}
|
||||||
|
|
||||||
|
# Append feed_credential as late as possible before calling wget to avoid logging feed_credential
|
||||||
|
if [[ "$remote_path" == "$azure_feed"* ]] || [[ "$remote_path" == "$uncached_feed"* ]]; then
|
||||||
|
remote_path="${remote_path}${feed_credential}"
|
||||||
|
fi
|
||||||
|
|
||||||
local failed=false
|
local failed=false
|
||||||
if [ -z "$out_path" ]; then
|
if [ -z "$out_path" ]; then
|
||||||
wget -q --tries 10 $remote_path || failed=true
|
wget -q --tries 10 $remote_path || failed=true
|
||||||
|
@ -684,6 +694,7 @@ dry_run=false
|
||||||
no_path=false
|
no_path=false
|
||||||
azure_feed="https://dotnetcli.azureedge.net/dotnet"
|
azure_feed="https://dotnetcli.azureedge.net/dotnet"
|
||||||
uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
|
uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet"
|
||||||
|
feed_credential=""
|
||||||
verbose=false
|
verbose=false
|
||||||
shared_runtime=false
|
shared_runtime=false
|
||||||
runtime_id=""
|
runtime_id=""
|
||||||
|
@ -729,6 +740,10 @@ do
|
||||||
shift
|
shift
|
||||||
uncached_feed="$1"
|
uncached_feed="$1"
|
||||||
;;
|
;;
|
||||||
|
--feed-credential|-[Ff]eed[Cc]redential)
|
||||||
|
shift
|
||||||
|
feed_credential="$1"
|
||||||
|
;;
|
||||||
--runtime-id|-[Rr]untime[Ii]d)
|
--runtime-id|-[Rr]untime[Ii]d)
|
||||||
shift
|
shift
|
||||||
runtime_id="$1"
|
runtime_id="$1"
|
||||||
|
@ -763,22 +778,24 @@ do
|
||||||
echo " coherent applies only to SDK downloads"
|
echo " coherent applies only to SDK downloads"
|
||||||
echo " - 3-part version in a format A.B.C - represents specific version of build"
|
echo " - 3-part version in a format A.B.C - represents specific version of build"
|
||||||
echo " examples: 2.0.0-preview2-006120; 1.1.0"
|
echo " examples: 2.0.0-preview2-006120; 1.1.0"
|
||||||
echo " -i,--install-dir <DIR> Install under specified location (see Install Location below)"
|
echo " -i,--install-dir <DIR> Install under specified location (see Install Location below)"
|
||||||
echo " -InstallDir"
|
echo " -InstallDir"
|
||||||
echo " --architecture <ARCHITECTURE> Architecture of .NET Tools. Currently only x64 is supported."
|
echo " --architecture <ARCHITECTURE> Architecture of .NET Tools. Currently only x64 is supported."
|
||||||
echo " --arch,-Architecture,-Arch"
|
echo " --arch,-Architecture,-Arch"
|
||||||
echo " --shared-runtime Installs just the shared runtime bits, not the entire SDK."
|
echo " --shared-runtime Installs just the shared runtime bits, not the entire SDK."
|
||||||
echo " -SharedRuntime"
|
echo " -SharedRuntime"
|
||||||
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
echo " --debug-symbols,-DebugSymbols Specifies if symbols should be included in the installation."
|
||||||
|
echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable."
|
||||||
echo " -SkipNonVersionedFiles"
|
echo " -SkipNonVersionedFiles"
|
||||||
echo " --dry-run,-DryRun Do not perform installation. Display download link."
|
echo " --dry-run,-DryRun Do not perform installation. Display download link."
|
||||||
echo " --no-path, -NoPath Do not set PATH for the current process."
|
echo " --no-path, -NoPath Do not set PATH for the current process."
|
||||||
echo " --verbose,-Verbose Display diagnostics information."
|
echo " --verbose,-Verbose Display diagnostics information."
|
||||||
echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user."
|
echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user."
|
||||||
echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user."
|
echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user."
|
||||||
echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)."
|
echo " --feed-credential,-FeedCredential Azure feed shared access token. This parameter typically is not specified."
|
||||||
|
echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)."
|
||||||
echo " -RuntimeId"
|
echo " -RuntimeId"
|
||||||
echo " -?,--?,-h,--help,-Help Shows this help message"
|
echo " -?,--?,-h,--help,-Help Shows this help message"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Install Location:"
|
echo "Install Location:"
|
||||||
echo " Location is chosen in following order:"
|
echo " Location is chosen in following order:"
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="..\..\shared\Utilities\MSBuildListSplitter.cs" />
|
||||||
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\**\*.cs" />
|
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\**\*.cs" />
|
||||||
<None Include="module.props" CopyToPublishDirectory="PreserveNewest" />
|
<None Include="module.props" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<None Include="BuildTools.Tasks.props" CopyToPublishDirectory="PreserveNewest" />
|
<None Include="BuildTools.Tasks.props" CopyToPublishDirectory="PreserveNewest" />
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<Project>
|
<Project>
|
||||||
|
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GenerateResxDesignerFiles" AssemblyFile="$(_BuildToolsAssembly)" />
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GenerateResxDesignerFiles" AssemblyFile="$(_BuildToolsAssembly)" />
|
||||||
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GenerateFileFromTemplate" AssemblyFile="$(_BuildToolsAssembly)" />
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetAssemblyFileVersion" AssemblyFile="$(_BuildToolsAssembly)" />
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetAssemblyFileVersion" AssemblyFile="$(_BuildToolsAssembly)" />
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetGitCommitInfo" AssemblyFile="$(_BuildToolsAssembly)" />
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetGitCommitInfo" AssemblyFile="$(_BuildToolsAssembly)" />
|
||||||
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetDotNetHost" AssemblyFile="$(_BuildToolsAssembly)"
|
<UsingTask TaskName="Microsoft.AspNetCore.BuildTools.$(_BuildTasksPrefix)GetDotNetHost" AssemblyFile="$(_BuildToolsAssembly)"
|
||||||
|
|
|
@ -0,0 +1,153 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.Build.Framework;
|
||||||
|
using Microsoft.Build.Utilities;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.BuildTools
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// <para>
|
||||||
|
/// Generates a new file at <see cref="OutputPath"/>.
|
||||||
|
/// </para>
|
||||||
|
/// <para>
|
||||||
|
/// The <see cref="TemplateFile"/> can define variables for substitution using <see cref="Properties"/>.
|
||||||
|
/// </para>
|
||||||
|
/// <example>
|
||||||
|
/// The input file might look like this:
|
||||||
|
/// <code>
|
||||||
|
/// 2 + 2 = ${Sum}
|
||||||
|
/// </code>
|
||||||
|
/// When the task is invoked like this, it will produce "2 + 2 = 4"
|
||||||
|
/// <code>
|
||||||
|
/// <GenerateFileFromTemplate Properties="Sum=4;OtherValue=123;" ... >
|
||||||
|
/// </code>
|
||||||
|
/// </example>
|
||||||
|
/// </summary>
|
||||||
|
#if SDK
|
||||||
|
public class Sdk_GenerateFileFromTemplate : Task
|
||||||
|
#elif BuildTools
|
||||||
|
public class GenerateFileFromTemplate : Task
|
||||||
|
#else
|
||||||
|
#error This must be built either for an SDK or for BuildTools
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The template file.
|
||||||
|
/// Variable syntax: ${VarName}
|
||||||
|
/// If your template file needs to output this format, you can escape the dollar sign with a backtick, e.g. `${NotReplaced}
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public string TemplateFile { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The destination for the generated file.
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
[Output]
|
||||||
|
public string OutputPath { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Key=value pairs of values
|
||||||
|
/// </summary>
|
||||||
|
[Required]
|
||||||
|
public string[] Properties { get; set; }
|
||||||
|
|
||||||
|
public override bool Execute()
|
||||||
|
{
|
||||||
|
var outputPath = Path.GetFullPath(OutputPath.Replace('\\', '/'));
|
||||||
|
|
||||||
|
if (!File.Exists(TemplateFile))
|
||||||
|
{
|
||||||
|
Log.LogError($"File {TemplateFile} does not exist");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var values = MSBuildListSplitter.GetNamedProperties(Properties);
|
||||||
|
var template = File.ReadAllText(TemplateFile);
|
||||||
|
|
||||||
|
var result = Replace(template, values);
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
|
||||||
|
File.WriteAllText(outputPath, result);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal string Replace(string template, IDictionary<string, string> values)
|
||||||
|
{
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
var varNameSb = new StringBuilder();
|
||||||
|
var line = 1;
|
||||||
|
for (var i = 0; i < template.Length; i++)
|
||||||
|
{
|
||||||
|
var ch = template[i];
|
||||||
|
var nextCh = i + 1 >= template.Length
|
||||||
|
? '\0'
|
||||||
|
: template[i + 1];
|
||||||
|
|
||||||
|
// count lines in the template file
|
||||||
|
if (ch == '\n')
|
||||||
|
{
|
||||||
|
line++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch == '`' && (nextCh == '$' || nextCh == '`'))
|
||||||
|
{
|
||||||
|
// skip the backtick for known escape characters
|
||||||
|
i++;
|
||||||
|
sb.Append(nextCh);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ch != '$' || nextCh != '{')
|
||||||
|
{
|
||||||
|
// variables begin with ${. Moving on.
|
||||||
|
sb.Append(ch);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
varNameSb.Clear();
|
||||||
|
i += 2;
|
||||||
|
for (; i < template.Length; i++)
|
||||||
|
{
|
||||||
|
ch = template[i];
|
||||||
|
if (ch != '}')
|
||||||
|
{
|
||||||
|
varNameSb.Append(ch);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Found the end of the variable substitution
|
||||||
|
var varName = varNameSb.ToString();
|
||||||
|
if (values.TryGetValue(varName, out var value))
|
||||||
|
{
|
||||||
|
sb.Append(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log.LogWarning(null, null, null, TemplateFile,
|
||||||
|
line, 0, 0, 0,
|
||||||
|
message: $"No property value is available for '{varName}'");
|
||||||
|
}
|
||||||
|
|
||||||
|
varNameSb.Clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (varNameSb.Length > 0)
|
||||||
|
{
|
||||||
|
Log.LogWarning(null, null, null, TemplateFile,
|
||||||
|
line, 0, 0, 0,
|
||||||
|
message: "Expected closing bracket for variable placeholder. No substitution will be made.");
|
||||||
|
sb.Append("${").Append(varNameSb.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
[assembly: InternalsVisibleTo("BuildTools.Tasks.Tests")]
|
|
@ -45,7 +45,7 @@ namespace Microsoft.AspNetCore.BuildTools
|
||||||
|
|
||||||
public override bool Execute()
|
public override bool Execute()
|
||||||
{
|
{
|
||||||
var workDir = FileHelpers.EnsureTrailingSlash(WorkingDirectory);
|
var workDir = FileHelpers.EnsureTrailingSlash(WorkingDirectory).Replace('\\', '/');
|
||||||
|
|
||||||
foreach (var file in SourceFiles)
|
foreach (var file in SourceFiles)
|
||||||
{
|
{
|
||||||
|
@ -54,15 +54,16 @@ namespace Microsoft.AspNetCore.BuildTools
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file.ItemSpec.StartsWith(workDir))
|
var filePath = file.ItemSpec.Replace('\\', '/');
|
||||||
|
if (!filePath.StartsWith(workDir))
|
||||||
{
|
{
|
||||||
Log.LogError("Item {0} is not inside the working directory {1}. Set the metadata 'Link' to file path that should be used within the zip archive",
|
Log.LogError("Item {0} is not inside the working directory {1}. Set the metadata 'Link' to file path that should be used within the zip archive",
|
||||||
file.ItemSpec,
|
filePath,
|
||||||
workDir);
|
workDir);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
file.SetMetadata("Link", file.ItemSpec.Substring(workDir.Length));
|
file.SetMetadata("Link", filePath.Substring(workDir.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
var fileMode = Overwrite
|
var fileMode = Overwrite
|
||||||
|
|
|
@ -9,11 +9,11 @@ using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Build.Framework;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
using KoreBuild.Tasks.Policies;
|
using KoreBuild.Tasks.Policies;
|
||||||
using KoreBuild.Tasks.ProjectModel;
|
using KoreBuild.Tasks.ProjectModel;
|
||||||
using KoreBuild.Tasks.Utilties;
|
using Microsoft.AspNetCore.BuildTools;
|
||||||
|
using Microsoft.Build.Framework;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace KoreBuild.Tasks
|
namespace KoreBuild.Tasks
|
||||||
{
|
{
|
||||||
|
@ -51,18 +51,18 @@ namespace KoreBuild.Tasks
|
||||||
/// Key-value base list of properties to be applied to <see cref="Projects" /> during project evaluation.
|
/// Key-value base list of properties to be applied to <see cref="Projects" /> during project evaluation.
|
||||||
/// e.g. "Configuration=Debug;BuildNumber=1234"
|
/// e.g. "Configuration=Debug;BuildNumber=1234"
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string ProjectProperties { get; set; }
|
public string[] ProjectProperties { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// NuGet sources, ; delimited. When set, they override sources from NuGet.config.
|
/// NuGet sources. When set, they override sources from NuGet.config.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string RestoreSources { get; set; }
|
public string[] RestoreSources { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// NuGet sources, ; delimited.
|
/// NuGet sources.
|
||||||
/// When set they are in addition to source from NuGet.config and/or <see cref="RestoreSources"/>.
|
/// When set they are in addition to source from NuGet.config and/or <see cref="RestoreSources"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string RestoreAdditionalSources { get; set; }
|
public string[] RestoreAdditionalSources { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// User packages folder
|
/// User packages folder
|
||||||
|
@ -124,8 +124,8 @@ namespace KoreBuild.Tasks
|
||||||
SolutionDirectory = SolutionDirectory,
|
SolutionDirectory = SolutionDirectory,
|
||||||
Projects = projects,
|
Projects = projects,
|
||||||
Log = Log,
|
Log = Log,
|
||||||
RestoreSources = MSBuildListSplitter.SplitItemList(RestoreSources).ToList(),
|
RestoreSources = RestoreSources?.ToList() ?? new List<string>(),
|
||||||
RestoreAdditionalSources = MSBuildListSplitter.SplitItemList(RestoreAdditionalSources).ToList(),
|
RestoreAdditionalSources = RestoreAdditionalSources?.ToList() ?? new List<string>(),
|
||||||
RestorePackagesPath = RestorePackagesPath,
|
RestorePackagesPath = RestorePackagesPath,
|
||||||
RestoreDisableParallel = RestoreDisableParallel,
|
RestoreDisableParallel = RestoreDisableParallel,
|
||||||
RestoreConfigFile = RestoreConfigFile,
|
RestoreConfigFile = RestoreConfigFile,
|
||||||
|
|
|
@ -8,9 +8,8 @@ using System.Linq;
|
||||||
using Microsoft.Build.Construction;
|
using Microsoft.Build.Construction;
|
||||||
using Microsoft.Build.Evaluation;
|
using Microsoft.Build.Evaluation;
|
||||||
using Microsoft.Build.Execution;
|
using Microsoft.Build.Execution;
|
||||||
using NuGet.Frameworks;
|
|
||||||
using KoreBuild.Tasks.Utilties;
|
|
||||||
using Microsoft.Build.Utilities;
|
using Microsoft.Build.Utilities;
|
||||||
|
using NuGet.Frameworks;
|
||||||
|
|
||||||
namespace KoreBuild.Tasks.ProjectModel
|
namespace KoreBuild.Tasks.ProjectModel
|
||||||
{
|
{
|
||||||
|
@ -81,7 +80,7 @@ namespace KoreBuild.Tasks.ProjectModel
|
||||||
var noWarn = item.GetMetadataValue("NoWarn");
|
var noWarn = item.GetMetadataValue("NoWarn");
|
||||||
IReadOnlyList<string> noWarnItems = string.IsNullOrEmpty(noWarn)
|
IReadOnlyList<string> noWarnItems = string.IsNullOrEmpty(noWarn)
|
||||||
? Array.Empty<string>()
|
? Array.Empty<string>()
|
||||||
: MSBuildListSplitter.SplitItemList(noWarn).ToArray();
|
: noWarn.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
var info = new PackageReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"), isImplicit, noWarnItems);
|
var info = new PackageReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"), isImplicit, noWarnItems);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
@ -9,6 +9,7 @@
|
||||||
<Content Include="*.props" CopyToPublishDirectory="PreserveNewest" />
|
<Content Include="*.props" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<Content Include="*.targets" CopyToPublishDirectory="PreserveNewest" />
|
<Content Include="*.targets" CopyToPublishDirectory="PreserveNewest" />
|
||||||
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\Utilities\*.cs" />
|
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\Utilities\*.cs" />
|
||||||
|
<Compile Include="..\..\shared\Utilities\MSBuildListSplitter.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -4,12 +4,12 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Microsoft.AspNetCore.BuildTools;
|
||||||
using Microsoft.Build.Framework;
|
using Microsoft.Build.Framework;
|
||||||
using Microsoft.Build.Utilities;
|
using Microsoft.Build.Utilities;
|
||||||
using NuGet.Frameworks;
|
using NuGet.Frameworks;
|
||||||
using NuGet.Packaging;
|
using NuGet.Packaging;
|
||||||
using NuGet.Packaging.Core;
|
using NuGet.Packaging.Core;
|
||||||
using KoreBuild.Tasks.Utilties;
|
|
||||||
using NuGet.Versioning;
|
using NuGet.Versioning;
|
||||||
|
|
||||||
namespace KoreBuild.Tasks
|
namespace KoreBuild.Tasks
|
||||||
|
@ -26,7 +26,7 @@ namespace KoreBuild.Tasks
|
||||||
|
|
||||||
public ITaskItem[] Dependencies { get; set; }
|
public ITaskItem[] Dependencies { get; set; }
|
||||||
|
|
||||||
public string Properties { get; set; }
|
public string[] Properties { get; set; }
|
||||||
|
|
||||||
public bool IncludeEmptyDirectories { get; set; } = false;
|
public bool IncludeEmptyDirectories { get; set; } = false;
|
||||||
|
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace KoreBuild.Tasks.Utilties
|
|
||||||
{
|
|
||||||
public static class MSBuildListSplitter
|
|
||||||
{
|
|
||||||
private static readonly char[] SemiColon = { ';' };
|
|
||||||
|
|
||||||
public static IEnumerable<string> SplitItemList(string value)
|
|
||||||
{
|
|
||||||
return string.IsNullOrEmpty(value)
|
|
||||||
? Enumerable.Empty<string>()
|
|
||||||
: value.Split(SemiColon, StringSplitOptions.RemoveEmptyEntries);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IDictionary<string, string> GetNamedProperties(string input)
|
|
||||||
{
|
|
||||||
var values = new Dictionary<string, string>();
|
|
||||||
if (string.IsNullOrEmpty(input))
|
|
||||||
{
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in input.Split(SemiColon, StringSplitOptions.RemoveEmptyEntries))
|
|
||||||
{
|
|
||||||
var splitIdx = item.IndexOf('=');
|
|
||||||
if (splitIdx <= 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var key = item.Substring(0, splitIdx);
|
|
||||||
var value = item.Substring(splitIdx + 1);
|
|
||||||
values[key] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return values;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -53,5 +53,4 @@
|
||||||
DotNetHome="$(DOTNET_HOME)"
|
DotNetHome="$(DOTNET_HOME)"
|
||||||
InstallScript="$(_DotNetInstall)"/>
|
InstallScript="$(_DotNetInstall)"/>
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
<Project>
|
<Project>
|
||||||
|
<Import Project="..\..\build\tasks\RepoTasks.tasks" />
|
||||||
|
|
||||||
<Target Name="Publish">
|
<Target Name="Publish">
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Projects Include="$(MSBuildThisFileDirectory)console\NuGetPackageVerifier.Console.csproj" />
|
<Projects Include="$(MSBuildThisFileDirectory)console\NuGetPackageVerifier.Console.csproj" />
|
||||||
|
@ -10,5 +12,15 @@
|
||||||
Properties="PublishDir=$(PublishDir);Configuration=$(Configuration)" />
|
Properties="PublishDir=$(PublishDir);Configuration=$(Configuration)" />
|
||||||
|
|
||||||
<Copy SourceFiles="module.targets" DestinationFolder="$(PublishDir)" />
|
<Copy SourceFiles="module.targets" DestinationFolder="$(PublishDir)" />
|
||||||
|
|
||||||
|
<MSBuild Projects="$(MSBuildThisFileDirectory)console\NuGetPackageVerifier.Console.csproj"
|
||||||
|
Targets="GetRuntimeVersion"
|
||||||
|
Properties="Configuration=$(Configuration)">
|
||||||
|
<Output TaskParameter="TargetOutputs" PropertyName="NgpvRuntimeFrameworkVersion" />
|
||||||
|
</MSBuild>
|
||||||
|
|
||||||
|
<GenerateFileFromTemplate TemplateFile="$(MSBuildThisFileDirectory)module.props.in"
|
||||||
|
Properties="RuntimeFrameworkVersion=$(NgpvRuntimeFrameworkVersion)"
|
||||||
|
OutputPath="$(PublishDir)module.props" />
|
||||||
</Target>
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -20,4 +20,6 @@
|
||||||
<PackageReference Include="NuGet.Packaging" Version="$(NuGetPackagesVersion)" />
|
<PackageReference Include="NuGet.Packaging" Version="$(NuGetPackagesVersion)" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<Target Name="GetRuntimeVersion" Returns="$(RuntimeFrameworkVersion)" />
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
<Project>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- Ensure we have the runtime required to execute the nuget package verifier -->
|
||||||
|
<DotNetCoreRuntime Include="${RuntimeFrameworkVersion}" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,50 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.BuildTools
|
||||||
|
{
|
||||||
|
internal static class MSBuildListSplitter
|
||||||
|
{
|
||||||
|
public static IDictionary<string, string> GetNamedProperties(string input)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(input))
|
||||||
|
{
|
||||||
|
return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetNamedProperties(input.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDictionary<string, string> GetNamedProperties(string[] input)
|
||||||
|
{
|
||||||
|
var values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
if (input == null)
|
||||||
|
{
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in input)
|
||||||
|
{
|
||||||
|
var splitIdx = item.IndexOf('=');
|
||||||
|
if (splitIdx < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var key = item.Substring(0, splitIdx).Trim();
|
||||||
|
if (string.IsNullOrEmpty(key))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = item.Substring(splitIdx + 1);
|
||||||
|
values[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,6 +21,7 @@
|
||||||
<Compile Include="$(BuildToolsPath)*.cs" />
|
<Compile Include="$(BuildToolsPath)*.cs" />
|
||||||
<Compile Include="$(BuildToolsPath)Utilities\*.cs" />
|
<Compile Include="$(BuildToolsPath)Utilities\*.cs" />
|
||||||
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\**\*.cs" />
|
<Compile Include="..\..\shared\Microsoft.Extensions.CommandLineUtils.Sources\**\*.cs" />
|
||||||
|
<Compile Include="..\..\shared\Utilities\MSBuildListSplitter.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Build" Version="$(MicrosoftBuildVersion)" />
|
||||||
<PackageReference Include="Microsoft.Build.Framework" Version="$(MicrosoftBuildVersion)" />
|
<PackageReference Include="Microsoft.Build.Framework" Version="$(MicrosoftBuildVersion)" />
|
||||||
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildVersion)" />
|
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="$(MicrosoftBuildVersion)" />
|
||||||
<PackageReference Include="Microsoft.DotNet.Cli.Utils" Version="$(DotNetCliUtilsVersion)" />
|
<PackageReference Include="Microsoft.DotNet.Cli.Utils" Version="$(DotNetCliUtilsVersion)" />
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.AspNetCore.BuildTools;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace BuildTools.Tasks.Tests
|
||||||
|
{
|
||||||
|
public class GenerateFileFromTemplateTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public void WarnsForMissingVariableNames()
|
||||||
|
{
|
||||||
|
var engine = new MockEngine();
|
||||||
|
var task = new GenerateFileFromTemplate
|
||||||
|
{
|
||||||
|
BuildEngine = engine,
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.Equal("Hello !", task.Replace("Hello ${World}!", new Dictionary<string, string>()));
|
||||||
|
var warning = Assert.Single(engine.Warnings);
|
||||||
|
Assert.Contains("No property value", warning.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void WarnsWhenExpectingClosingBrace()
|
||||||
|
{
|
||||||
|
var engine = new MockEngine();
|
||||||
|
var task = new GenerateFileFromTemplate
|
||||||
|
{
|
||||||
|
BuildEngine = engine,
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.Equal("Hello ${Greeting!", task.Replace("Hello ${Greeting!", new Dictionary<string, string>()));
|
||||||
|
var warning = Assert.Single(engine.Warnings);
|
||||||
|
Assert.Contains("Expected closing bracket", warning.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(SubsitutionData))]
|
||||||
|
public void SubsitutesVariableNames(string template, IDictionary<string, string> variables, string output)
|
||||||
|
{
|
||||||
|
var engine = new MockEngine();
|
||||||
|
var task = new GenerateFileFromTemplate
|
||||||
|
{
|
||||||
|
BuildEngine = engine,
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.Equal(output, task.Replace(template, variables));
|
||||||
|
Assert.Empty(engine.Warnings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TheoryData<string, IDictionary<string, string>, string> SubsitutionData
|
||||||
|
=> new TheoryData<string, IDictionary<string, string>, string>
|
||||||
|
{
|
||||||
|
{"`", new Dictionary<string,string> {}, "`" },
|
||||||
|
{"`other", new Dictionary<string,string> {}, @"`other" },
|
||||||
|
{"```$", new Dictionary<string,string> {}, "`$" },
|
||||||
|
{"``", new Dictionary<string,string> {}, "`" },
|
||||||
|
{"`$", new Dictionary<string,string> {}, "$" },
|
||||||
|
{@"`${Hello", new Dictionary<string,string> {}, @"${Hello" },
|
||||||
|
{"Hello ${Greeting}", new Dictionary<string,string> {["Greeting"] = "World"}, "Hello World" },
|
||||||
|
{@"Hello `${Greeting}", new Dictionary<string,string> {["Greeting"] = "World"}, @"Hello ${Greeting}" },
|
||||||
|
{"Hello ${Greeting}!", new Dictionary<string,string> {["Greeting"] = "World"}, @"Hello World!" },
|
||||||
|
{"${One}${Two}${Three}", new Dictionary<string,string> {["One"] = "1", ["Two"]="2", ["Three"] = "3"}, "123" },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
|
@ -138,7 +138,7 @@ EndGlobal
|
||||||
MSBuildEnvironmentHelper.InitializeEnvironment(_output);
|
MSBuildEnvironmentHelper.InitializeEnvironment(_output);
|
||||||
var task = new ApplyNuGetPolicies
|
var task = new ApplyNuGetPolicies
|
||||||
{
|
{
|
||||||
ProjectProperties = "BuildNumber=123;Configuration=Release",
|
ProjectProperties = new[] { "BuildNumber=123", "Configuration=Release" },
|
||||||
Projects = items,
|
Projects = items,
|
||||||
BuildEngine = new MockEngine(),
|
BuildEngine = new MockEngine(),
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,7 +98,7 @@ namespace KoreBuild.Tasks.Tests
|
||||||
BasePath = _tempDir,
|
BasePath = _tempDir,
|
||||||
BuildEngine = new MockEngine(),
|
BuildEngine = new MockEngine(),
|
||||||
DestinationFolder = _tempDir,
|
DestinationFolder = _tempDir,
|
||||||
Properties = $"version={version};;description={description};copyright=;;;;",
|
Properties = new[] { $"version={version}", "", "", $" description ={description}", "copyright=", },
|
||||||
};
|
};
|
||||||
|
|
||||||
Assert.True(task.Execute(), "The task should have passed");
|
Assert.True(task.Execute(), "The task should have passed");
|
||||||
|
|
|
@ -4,6 +4,7 @@ RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
git \
|
git \
|
||||||
# KoreBuild dependencies
|
# KoreBuild dependencies
|
||||||
|
jq \
|
||||||
curl \
|
curl \
|
||||||
unzip \
|
unzip \
|
||||||
apt-transport-https \
|
apt-transport-https \
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
"default": "dev",
|
"default": "dev",
|
||||||
"enum": [
|
"enum": [
|
||||||
"dev",
|
"dev",
|
||||||
"rel/2.0.0"
|
"rel/2.0.0",
|
||||||
|
"rel/2.0.2"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
<KoreBuildChannel>dev</KoreBuildChannel>
|
<KoreBuildChannel>dev</KoreBuildChannel>
|
||||||
<VersionPrefix>2.1.0</VersionPrefix>
|
<VersionPrefix>2.1.0</VersionPrefix>
|
||||||
<VersionSuffix>preview1</VersionSuffix>
|
<VersionSuffix>preview1</VersionSuffix>
|
||||||
<VersionSuffix Condition="'$(BuildNumber)' != ''">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
|
<VersionSuffix Condition="'$(VersionSuffix)' != '' AND '$(BuildNumber)' != ''">$(VersionSuffix)-$(BuildNumber)</VersionSuffix>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче