Browse Source

Always download the latest template.

pull/1120/head
Halil ibrahim Kalkan 7 years ago
parent
commit
4fdc01a6ca
  1. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs
  2. 12
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
  3. 117
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoTemplateStore.cs
  4. 10
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildContext.cs
  5. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/NugetReferenceReplaceStep.cs
  6. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateStore.cs
  7. 6
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuilder.cs
  8. 5
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateFile.cs
  9. 15
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/VersionHelper.cs

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliPaths.cs

@ -12,4 +12,4 @@ namespace Volo.Abp.Cli
private static readonly string AbpRootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".abp"); private static readonly string AbpRootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".abp");
} }
} }

12
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

@ -1,11 +1,11 @@
using System; using System;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Args;
using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli namespace Volo.Abp.Cli
@ -32,7 +32,7 @@ namespace Volo.Abp.Cli
public async Task RunAsync(string[] args) public async Task RunAsync(string[] args)
{ {
Logger.LogInformation($"ABP CLI, version {VersionHelper.Version}."); Logger.LogInformation($"ABP CLI, version {GetCliVersion()}.");
Logger.LogInformation("https://abp.io"); Logger.LogInformation("https://abp.io");
var commandLineArgs = CommandLineArgumentParser.Parse(args); var commandLineArgs = CommandLineArgumentParser.Parse(args);
@ -56,5 +56,13 @@ namespace Volo.Abp.Cli
} }
} }
} }
private static string GetCliVersion()
{
return typeof(CliService)
.Assembly
.GetFileVersion()
.RemovePostFix(".0");
}
} }
} }

117
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoTemplateStore.cs

@ -37,47 +37,80 @@ namespace Volo.Abp.Cli.ProjectBuilding
public async Task<TemplateFile> GetAsync( public async Task<TemplateFile> GetAsync(
string name, string name,
string version,
DatabaseProvider databaseProvider, DatabaseProvider databaseProvider,
string projectName) string projectName,
string version = null)
{ {
var localCacheFolder = Path.Combine(CliPaths.TemplateCache, version); if (version == null)
DirectoryHelper.CreateIfNotExists(localCacheFolder); {
version = await GetLatestTemplateVersionAsync(name);
}
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
var localCacheFile = Path.Combine(localCacheFolder, name + ".zip"); var localCacheFile = Path.Combine(CliPaths.TemplateCache, name + "-" + version + ".zip");
if (File.Exists(localCacheFile)) if (File.Exists(localCacheFile))
{ {
Logger.LogInformation("Using cached template: " + name + ", version: " + version); Logger.LogInformation("Using cached template: " + name + ", version: " + version);
return new TemplateFile(File.ReadAllBytes(localCacheFile)); return new TemplateFile(File.ReadAllBytes(localCacheFile), version);
} }
Logger.LogInformation("Downloading template: " + name + ", version: " + version); Logger.LogInformation("Downloading template: " + name + ", version: " + version);
using (var client = new System.Net.Http.HttpClient()) var fileContent = await DownloadTemplateFileContentAsync(
new TemplateDownloadInputDto
{
Name = name,
Version = version,
DatabaseProvider = databaseProvider.ToString(),
ProjectName = projectName
}
);
File.WriteAllBytes(localCacheFile, fileContent);
return new TemplateFile(fileContent, version);
}
private async Task<string> GetLatestTemplateVersionAsync(string name)
{
var postData = JsonSerializer.Serialize(new GetLatestTemplateVersionDto { Name = name });
using (var client = new HttpClient())
{ {
client.Timeout = TimeSpan.FromMinutes(3); client.Timeout = TimeSpan.FromSeconds(30);
if (File.Exists(CliPaths.AccessToken)) AddAuthentication(client);
var responseMessage = await client.PostAsync(
Options.AbpIoWwwUrlRoot + "api/download/template/get-version/",
new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
CancellationTokenProvider.Token
);
if (!responseMessage.IsSuccessStatusCode)
{ {
var accessToken = File.ReadAllText(CliPaths.AccessToken, Encoding.UTF8); throw new Exception("Remote server returns error! HTTP status code: " + responseMessage.StatusCode);
if (!accessToken.IsNullOrEmpty())
{
client.SetBearerToken(accessToken);
}
} }
var serializedPostDataAsString = JsonSerializer.Serialize(new var result = await responseMessage.Content.ReadAsStringAsync();
{ return JsonSerializer.Deserialize<GetLatestTemplateVersionResultDto>(result).Version;
name = name, }
version = version, }
databaseProvider = databaseProvider,
projectName = projectName private async Task<byte[]> DownloadTemplateFileContentAsync(TemplateDownloadInputDto input)
}); {
var postData = JsonSerializer.Serialize(input);
using (var client = new HttpClient())
{
client.Timeout = TimeSpan.FromMinutes(3);
AddAuthentication(client);
var downloadUrl = Options.AbpIoWwwUrlRoot + "api/download/template/";
var responseMessage = await client.PostAsync( var responseMessage = await client.PostAsync(
downloadUrl, Options.AbpIoWwwUrlRoot + "api/download/template/",
new StringContent(serializedPostDataAsString, Encoding.UTF8, MimeTypes.Application.Json), new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
CancellationTokenProvider.Token CancellationTokenProvider.Token
); );
@ -86,11 +119,41 @@ namespace Volo.Abp.Cli.ProjectBuilding
throw new Exception("Remote server returns error! HTTP status code: " + responseMessage.StatusCode); throw new Exception("Remote server returns error! HTTP status code: " + responseMessage.StatusCode);
} }
var fileContent = await responseMessage.Content.ReadAsByteArrayAsync(); return await responseMessage.Content.ReadAsByteArrayAsync();
}
}
File.WriteAllBytes(localCacheFile, fileContent); private static void AddAuthentication(HttpClient client)
return new TemplateFile(fileContent); {
if (File.Exists(CliPaths.AccessToken))
{
var accessToken = File.ReadAllText(CliPaths.AccessToken, Encoding.UTF8);
if (!accessToken.IsNullOrEmpty())
{
client.SetBearerToken(accessToken);
}
} }
} }
public class TemplateDownloadInputDto
{
public string Name { get; set; }
public string Version { get; set; }
public string DatabaseProvider { get; set; }
public string ProjectName { get; set; }
}
public class GetLatestTemplateVersionDto
{
public string Name { get; set; }
}
public class GetLatestTemplateVersionResultDto
{
public string Version { get; set; }
}
} }
} }

10
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildContext.cs

@ -8,9 +8,6 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
[NotNull] [NotNull]
public TemplateFile TemplateFile { get; } public TemplateFile TemplateFile { get; }
[NotNull]
public string Version { get; }
[NotNull] [NotNull]
public ProjectBuildArgs BuildArgs { get; } public ProjectBuildArgs BuildArgs { get; }
@ -21,15 +18,14 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
public ProjectResult Result { get; set; } public ProjectResult Result { get; set; }
public ProjectBuildContext([NotNull] TemplateInfo template, public ProjectBuildContext(
[NotNull] TemplateInfo template,
[NotNull] TemplateFile templateFile, [NotNull] TemplateFile templateFile,
[NotNull] ProjectBuildArgs buildArgs, [NotNull] ProjectBuildArgs buildArgs)
[NotNull] string version)
{ {
Template = Check.NotNull(template, nameof(template)); Template = Check.NotNull(template, nameof(template));
TemplateFile = Check.NotNull(templateFile, nameof(templateFile)); TemplateFile = Check.NotNull(templateFile, nameof(templateFile));
BuildArgs = Check.NotNull(buildArgs, nameof(buildArgs)); BuildArgs = Check.NotNull(buildArgs, nameof(buildArgs));
Version = Check.NotNullOrWhiteSpace(version, nameof(version));
Result = new ProjectResult(); Result = new ProjectResult();
} }

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/NugetReferenceReplaceStep.cs

@ -14,7 +14,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
context.Files, context.Files,
"MyCompanyName", "MyCompanyName",
"MyProjectName", "MyProjectName",
context.Version context.TemplateFile.Version
).Run(); ).Run();
} }

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateStore.cs

@ -1,4 +1,5 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
namespace Volo.Abp.Cli.ProjectBuilding namespace Volo.Abp.Cli.ProjectBuilding
@ -7,9 +8,9 @@ namespace Volo.Abp.Cli.ProjectBuilding
{ {
Task<TemplateFile> GetAsync( Task<TemplateFile> GetAsync(
string name, string name,
string version,
DatabaseProvider databaseProvider, DatabaseProvider databaseProvider,
string projectName string projectName,
[CanBeNull] string version = null
); );
} }
} }

6
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuilder.cs

@ -31,11 +31,8 @@ namespace Volo.Abp.Cli.ProjectBuilding
} }
} }
var version = VersionHelper.Version;
var templateFile = await TemplateStore.GetAsync( var templateFile = await TemplateStore.GetAsync(
args.TemplateName, args.TemplateName,
version,
args.DatabaseProvider, args.DatabaseProvider,
args.SolutionName.FullName args.SolutionName.FullName
); );
@ -43,8 +40,7 @@ namespace Volo.Abp.Cli.ProjectBuilding
var context = new ProjectBuildContext( var context = new ProjectBuildContext(
templateInfo, templateInfo,
templateFile, templateFile,
args, args
version
); );
ProjectBuildPipelineBuilder.Build(context).Execute(context); ProjectBuildPipelineBuilder.Build(context).Execute(context);

5
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateFile.cs

@ -2,11 +2,14 @@
{ {
public class TemplateFile public class TemplateFile
{ {
public string Version { get; }
public byte[] FileBytes { get; } public byte[] FileBytes { get; }
public TemplateFile(byte[] fileBytes) public TemplateFile(byte[] fileBytes, string version)
{ {
FileBytes = fileBytes; FileBytes = fileBytes;
Version = version;
} }
} }
} }

15
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/VersionHelper.cs

@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace Volo.Abp.Cli.Utils
{
public static class VersionHelper
{
//public static string Version => typeof(AbpCliCoreModule).Assembly
// .GetFileVersion()
// .RemovePostFix(".0");
public static string Version => "0.17.0.0";
}
}
Loading…
Cancel
Save