mirror of https://github.com/abpframework/abp.git
25 changed files with 351 additions and 295 deletions
@ -1,9 +1,35 @@ |
|||||
using System.Collections.Generic; |
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
namespace Volo.Abp.Cli.Args |
namespace Volo.Abp.Cli.Args |
||||
{ |
{ |
||||
public class CommandLineOptions : Dictionary<string, string> |
public class CommandLineOptions : Dictionary<string, string> |
||||
{ |
{ |
||||
|
[CanBeNull] |
||||
|
public string GetOrNull([NotNull] string name, params string[] alternativeNames) |
||||
|
{ |
||||
|
Check.NotNullOrWhiteSpace(name, nameof(name)); |
||||
|
|
||||
|
var value = this.GetOrDefault(name); |
||||
|
if (!value.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
return value; |
||||
|
} |
||||
|
|
||||
|
if (!alternativeNames.IsNullOrEmpty()) |
||||
|
{ |
||||
|
foreach (var alternativeName in alternativeNames) |
||||
|
{ |
||||
|
value = this.GetOrDefault(alternativeName); |
||||
|
if (!value.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
return value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return null; |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
@ -1,43 +1,85 @@ |
|||||
using System; |
using System; |
||||
|
using System.IO; |
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
|
using Ionic.Zip; |
||||
using Volo.Abp.Cli.Args; |
using Volo.Abp.Cli.Args; |
||||
using Volo.Abp.DependencyInjection; |
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.ProjectBuilding; |
||||
using Volo.Abp.SolutionTemplating; |
using Volo.Abp.SolutionTemplating; |
||||
using Volo.Abp.SolutionTemplating.Building; |
using Volo.Abp.SolutionTemplating.Building; |
||||
|
using Volo.Abp.SolutionTemplating.Zipping; |
||||
|
|
||||
namespace Volo.Abp.Cli.Commands |
namespace Volo.Abp.Cli.Commands |
||||
{ |
{ |
||||
public class NewProjectCommand : IConsoleCommand, ITransientDependency |
public class NewProjectCommand : IConsoleCommand, ITransientDependency |
||||
{ |
{ |
||||
protected SolutionBuilder SolutionBuilder { get; } |
protected ProjectBuilder ProjectBuilder { get; } |
||||
|
|
||||
public NewProjectCommand(SolutionBuilder solutionBuilder) |
public NewProjectCommand(ProjectBuilder projectBuilder) |
||||
{ |
{ |
||||
SolutionBuilder = solutionBuilder; |
ProjectBuilder = projectBuilder; |
||||
} |
} |
||||
|
|
||||
public async Task ExecuteAsync(CommandLineArgs commandLineArgs) |
public async Task ExecuteAsync(CommandLineArgs commandLineArgs) |
||||
{ |
{ |
||||
if (commandLineArgs.Target == null) |
if (commandLineArgs.Target == null) |
||||
{ |
{ |
||||
Console.WriteLine("Solution name is missing."); |
Console.WriteLine("Project name is missing."); |
||||
Console.WriteLine("Usage:"); |
Console.WriteLine("Usage:"); |
||||
Console.WriteLine(" abp new <project-name>"); |
Console.WriteLine(" abp new <project-name> [-t <template-name>]"); |
||||
Console.WriteLine("Example:"); |
Console.WriteLine("Examples:"); |
||||
Console.WriteLine(" abp new Acme.BookStore"); |
Console.WriteLine(" abp new Acme.BookStore"); |
||||
|
Console.WriteLine(" abp new Acme.BookStore mvc"); |
||||
return; |
return; |
||||
} |
} |
||||
|
|
||||
Console.WriteLine("Creating a new solution"); |
Console.WriteLine("Creating a new solution"); |
||||
Console.WriteLine("Solution name: " + commandLineArgs.Target); |
Console.WriteLine("Solution name: " + commandLineArgs.Target); |
||||
|
|
||||
//await SolutionBuilder.BuildAsync(
|
var result = await ProjectBuilder.BuildAsync( |
||||
// null,
|
new ProjectBuildArgs( |
||||
// commandLineArgs.Target,
|
SolutionName.Parse(commandLineArgs.Target), |
||||
// DatabaseProvider.EntityFrameworkCore,
|
GetDatabaseProviderOrNull(commandLineArgs), |
||||
// "...",
|
commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long) |
||||
// true
|
) |
||||
//);
|
); |
||||
|
|
||||
|
using (var templateFileStream = new MemoryStream(result.ZipContent)) |
||||
|
{ |
||||
|
using (var templateZipFile = ZipFile.Read(templateFileStream)) |
||||
|
{ |
||||
|
templateZipFile.ExtractAll(Directory.GetCurrentDirectory(), ExtractExistingFileAction.Throw); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected virtual DatabaseProvider GetDatabaseProviderOrNull(CommandLineArgs commandLineArgs) |
||||
|
{ |
||||
|
var optionValue = commandLineArgs.Options.GetOrNull(Options.DatabaseProvider.Short, Options.DatabaseProvider.Long); |
||||
|
switch (optionValue) |
||||
|
{ |
||||
|
case "ef": |
||||
|
return DatabaseProvider.EntityFrameworkCore; |
||||
|
case "mongodb": |
||||
|
return DatabaseProvider.MongoDb; |
||||
|
default: |
||||
|
return DatabaseProvider.NotSpecified; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class Options |
||||
|
{ |
||||
|
public static class Template |
||||
|
{ |
||||
|
public const string Short = "t"; |
||||
|
public const string Long = "template"; |
||||
|
} |
||||
|
|
||||
|
public static class DatabaseProvider |
||||
|
{ |
||||
|
public const string Short = "d"; |
||||
|
public const string Long = "databaseProvider"; |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System.IO; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public class AbpIoTemplateStore : ITemplateStore, ITransientDependency |
||||
|
{ |
||||
|
public async Task<TemplateFile> GetAsync(string templateName, string version) |
||||
|
{ |
||||
|
return new TemplateFile( |
||||
|
File.ReadAllBytes("C:\\Temp\\abp-templates\\" + version + "\\" + templateName + ".zip") |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,10 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.SolutionTemplating; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public interface IProjectBuilder |
||||
|
{ |
||||
|
Task<ProjectBuildResult> BuildAsync(ProjectBuildArgs args); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public interface ITemplateInfoProvider |
||||
|
{ |
||||
|
TemplateInfo GetDefault(); |
||||
|
|
||||
|
TemplateInfo Get(string name); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public interface ITemplateStore |
||||
|
{ |
||||
|
Task<TemplateFile> GetAsync(string templateInfoName, string version); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.SolutionTemplating; |
||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public class ProjectBuildArgs |
||||
|
{ |
||||
|
[NotNull] |
||||
|
public SolutionName SolutionName { get; } |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public string TemplateName { get; set; } |
||||
|
|
||||
|
public DatabaseProvider DatabaseProvider { get; } |
||||
|
|
||||
|
public ProjectBuildArgs( |
||||
|
[NotNull] SolutionName solutionName, |
||||
|
DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified, |
||||
|
[CanBeNull] string templateName = null) |
||||
|
{ |
||||
|
DatabaseProvider = databaseProvider; |
||||
|
TemplateName = templateName; |
||||
|
SolutionName = Check.NotNull(solutionName, nameof(solutionName)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,52 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.SolutionTemplating; |
||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public class ProjectBuilder : IProjectBuilder, ITransientDependency |
||||
|
{ |
||||
|
protected ITemplateStore TemplateStore { get; } |
||||
|
protected ITemplateInfoProvider TemplateInfoProvider { get; } |
||||
|
|
||||
|
public ProjectBuilder(ITemplateStore templateStore, ITemplateInfoProvider templateInfoProvider) |
||||
|
{ |
||||
|
TemplateStore = templateStore; |
||||
|
TemplateInfoProvider = templateInfoProvider; |
||||
|
} |
||||
|
|
||||
|
public async Task<ProjectBuildResult> BuildAsync(ProjectBuildArgs args) |
||||
|
{ |
||||
|
var version = "0.16.0"; //TODO: Should get from somewhere!
|
||||
|
|
||||
|
var templateInfo = GetTemplateInfo(args); |
||||
|
|
||||
|
var templateFile = await TemplateStore.GetAsync(args.TemplateName, version); |
||||
|
|
||||
|
var context = new ProjectBuildContext( |
||||
|
templateInfo, |
||||
|
templateFile, |
||||
|
args, |
||||
|
version |
||||
|
); |
||||
|
|
||||
|
ProjectBuildPipelineBuilder.Build(context).Execute(context); |
||||
|
|
||||
|
return new ProjectBuildResult(context.Result.ZipContent, args.SolutionName.ProjectName); |
||||
|
} |
||||
|
|
||||
|
private TemplateInfo GetTemplateInfo(ProjectBuildArgs args) |
||||
|
{ |
||||
|
if (args.TemplateName.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
return TemplateInfoProvider.GetDefault(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
return TemplateInfoProvider.Get(args.TemplateName); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public class TemplateFile |
||||
|
{ |
||||
|
public byte[] FileBytes { get; } |
||||
|
|
||||
|
public TemplateFile(byte[] fileBytes) |
||||
|
{ |
||||
|
FileBytes = fileBytes; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,48 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.ProjectBuilding.Templates; |
||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding |
||||
|
{ |
||||
|
public class TemplateInfoProvider : ITemplateInfoProvider, ITransientDependency |
||||
|
{ |
||||
|
public TemplateInfo GetDefault() |
||||
|
{ |
||||
|
return Get(TemplateNames.Mvc); |
||||
|
} |
||||
|
|
||||
|
public TemplateInfo Get(string name) |
||||
|
{ |
||||
|
switch (name) |
||||
|
{ |
||||
|
case TemplateNames.Mvc: |
||||
|
return new MvcApplicationTemplate(); |
||||
|
case TemplateNames.MvcModule: |
||||
|
return new MvcModuleTemplate(); |
||||
|
case TemplateNames.Service: |
||||
|
return new ServiceTemplate(); |
||||
|
default: |
||||
|
throw new Exception("There is no template found with given name: " + name); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public static class TemplateNames |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// "mvc".
|
||||
|
/// </summary>
|
||||
|
public const string Mvc = "mvc"; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// "mvcmodule".
|
||||
|
/// </summary>
|
||||
|
public const string MvcModule = "mvcmodule"; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// "service".
|
||||
|
/// </summary>
|
||||
|
public const string Service = "service"; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
using Volo.Abp.SolutionTemplating.Building.Steps; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding.Templates |
||||
|
{ |
||||
|
public class MvcApplicationTemplate : TemplateInfo |
||||
|
{ |
||||
|
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context) |
||||
|
{ |
||||
|
var steps = new List<ProjectBuildPipelineStep>(); |
||||
|
SwitchDatabaseProvider(context, steps); |
||||
|
RemoveOtherDatabaseProviders(context, steps); |
||||
|
return steps; |
||||
|
} |
||||
|
|
||||
|
private static void SwitchDatabaseProvider(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps) |
||||
|
{ |
||||
|
if (context.BuildArgs.DatabaseProvider == DatabaseProvider.MongoDb) |
||||
|
{ |
||||
|
steps.Add(new SwitchEntityFrameworkCoreToMongoDbStep()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static void RemoveOtherDatabaseProviders(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps) |
||||
|
{ |
||||
|
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.EntityFrameworkCore) |
||||
|
{ |
||||
|
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore")); |
||||
|
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations")); |
||||
|
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Application.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Application.Tests")); |
||||
|
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Web.Tests")); |
||||
|
} |
||||
|
|
||||
|
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb) |
||||
|
{ |
||||
|
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB")); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding.Templates |
||||
|
{ |
||||
|
public class MvcModuleTemplate : TemplateInfo |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using Volo.Abp.SolutionTemplating.Building; |
||||
|
|
||||
|
namespace Volo.Abp.ProjectBuilding.Templates |
||||
|
{ |
||||
|
public class ServiceTemplate : TemplateInfo |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -1,8 +1,8 @@ |
|||||
namespace Volo.Abp.SolutionTemplating.Building |
namespace Volo.Abp.SolutionTemplating.Building |
||||
{ |
{ |
||||
public enum DatabaseProvider : byte |
public enum DatabaseProvider |
||||
{ |
{ |
||||
Irrelevant = 0, |
NotSpecified = 0, |
||||
EntityFrameworkCore = 1, |
EntityFrameworkCore = 1, |
||||
MongoDb = 2 |
MongoDb = 2 |
||||
} |
} |
||||
|
|||||
@ -1,28 +1,37 @@ |
|||||
using JetBrains.Annotations; |
using JetBrains.Annotations; |
||||
|
using Volo.Abp.ProjectBuilding; |
||||
using Volo.Abp.SolutionTemplating.Files; |
using Volo.Abp.SolutionTemplating.Files; |
||||
|
|
||||
namespace Volo.Abp.SolutionTemplating.Building |
namespace Volo.Abp.SolutionTemplating.Building |
||||
{ |
{ |
||||
public class ProjectBuildContext |
public class ProjectBuildContext |
||||
{ |
{ |
||||
public ProjectBuildRequest Request { get; } |
[NotNull] |
||||
|
public TemplateFile TemplateFile { get; } |
||||
|
|
||||
public string TemplatesFolder { get; } |
[NotNull] |
||||
|
public string Version { get; } |
||||
|
|
||||
|
[NotNull] |
||||
|
public ProjectBuildArgs BuildArgs { get; } |
||||
|
|
||||
|
[NotNull] |
||||
public TemplateInfo Template { get; } |
public TemplateInfo Template { get; } |
||||
|
|
||||
public FileEntryList Files { get; set; } |
public FileEntryList Files { get; set; } |
||||
|
|
||||
public ProjectResult Result { get; set; } |
public ProjectResult Result { get; set; } |
||||
|
|
||||
public ProjectBuildContext( |
public ProjectBuildContext([NotNull] TemplateInfo template, |
||||
[NotNull] TemplateInfo template, |
[NotNull] TemplateFile templateFile, |
||||
ProjectBuildRequest request, |
[NotNull] ProjectBuildArgs buildArgs, |
||||
string templatesFolder) |
[NotNull] string version) |
||||
{ |
{ |
||||
Template = Check.NotNull(template, nameof(template)); |
Template = Check.NotNull(template, nameof(template)); |
||||
Request = request; |
TemplateFile = Check.NotNull(templateFile, nameof(templateFile)); |
||||
TemplatesFolder = templatesFolder; |
BuildArgs = Check.NotNull(buildArgs, nameof(buildArgs)); |
||||
|
Version = Check.NotNullOrWhiteSpace(version, nameof(version)); |
||||
|
|
||||
Result = new ProjectResult(); |
Result = new ProjectResult(); |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -1,23 +0,0 @@ |
|||||
namespace Volo.Abp.SolutionTemplating.Building |
|
||||
{ |
|
||||
public class ProjectBuildRequest |
|
||||
{ |
|
||||
public SolutionName SolutionName { get; } |
|
||||
|
|
||||
public DatabaseProvider DatabaseProvider { get; } |
|
||||
|
|
||||
public string Version { get; } |
|
||||
|
|
||||
public bool ReplaceLocalReferencesToNuget { get; set; } |
|
||||
|
|
||||
public ProjectBuildRequest( |
|
||||
SolutionName solutionName, |
|
||||
DatabaseProvider databaseProvider, |
|
||||
string version) |
|
||||
{ |
|
||||
SolutionName = solutionName; |
|
||||
DatabaseProvider = databaseProvider; |
|
||||
Version = version; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,33 +0,0 @@ |
|||||
using System; |
|
||||
using System.IO; |
|
||||
using Volo.Abp.SolutionTemplating.Github; |
|
||||
|
|
||||
namespace Volo.Abp.SolutionTemplating.Building.Steps |
|
||||
{ |
|
||||
public class GithubDownloadStep : ProjectBuildPipelineStep |
|
||||
{ |
|
||||
public override void Execute(ProjectBuildContext context) |
|
||||
{ |
|
||||
var githubManager = new GithubManager(); |
|
||||
|
|
||||
context.Template.Version = githubManager.GetVersion(context); |
|
||||
|
|
||||
context.Template.FilePath = Path.Combine( |
|
||||
context.TemplatesFolder, |
|
||||
$"{context.Template.Name}-{context.Template.Version}.zip" |
|
||||
); |
|
||||
|
|
||||
context.Template.RootPathInZipFile = context.Template.GithubRepository.RepositoryName + "-" + context.Template.Version.RemovePreFix("v") + context.Template.RootPathInZipFile; |
|
||||
|
|
||||
try |
|
||||
{ |
|
||||
githubManager.DownloadIfNotExist(context); |
|
||||
} |
|
||||
catch (Exception e) |
|
||||
{ |
|
||||
throw e; //TODO: !!!
|
|
||||
//var existingVersion = githubManager.GetExistingVersion(context);
|
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,94 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.IO; |
|
||||
using System.Linq; |
|
||||
using System.Text; |
|
||||
using Newtonsoft.Json; |
|
||||
using Volo.Abp.SolutionTemplating.Building; |
|
||||
using Volo.Abp.Threading; |
|
||||
|
|
||||
namespace Volo.Abp.SolutionTemplating.Github |
|
||||
{ |
|
||||
public class GithubManager |
|
||||
{ |
|
||||
private static readonly object LockObject = new object(); |
|
||||
|
|
||||
public string GetVersion(ProjectBuildContext context) |
|
||||
{ |
|
||||
if (context.Request.Version.StartsWith("Branch:", StringComparison.OrdinalIgnoreCase)) |
|
||||
{ |
|
||||
//TODO: Should not cache branch files!
|
|
||||
return context.Request.Version.Substring("Branch:".Length); |
|
||||
} |
|
||||
|
|
||||
var url = "https://api.github.com/repos/" + context.Template.GithubRepository.RepositoryNameWithOrganization + "/releases"; |
|
||||
|
|
||||
using (var client = new System.Net.Http.HttpClient()) |
|
||||
{ |
|
||||
var credentials = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}:", context.Template.GithubRepository.AccessToken); |
|
||||
credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials)); |
|
||||
|
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); |
|
||||
client.Timeout = TimeSpan.FromMinutes(30); |
|
||||
|
|
||||
client.DefaultRequestHeaders.UserAgent.ParseAdd("MyAgent/1.0"); |
|
||||
var releases = JsonConvert.DeserializeObject<List<GithubRelease>>(client.GetStringAsync(url).Result); |
|
||||
|
|
||||
if (context.Request.Version == StandardVersions.LatestUnstable) |
|
||||
{ |
|
||||
return releases.FirstOrDefault(r => !r.IsPrerelease)?.Name; |
|
||||
} |
|
||||
|
|
||||
return releases.FirstOrDefault()?.Name; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public void DownloadIfNotExist(ProjectBuildContext context) |
|
||||
{ |
|
||||
using (var client = new System.Net.Http.HttpClient()) |
|
||||
{ |
|
||||
if (File.Exists(context.Template.FilePath)) |
|
||||
{ |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
lock (LockObject) |
|
||||
{ |
|
||||
if (File.Exists(context.Template.FilePath)) |
|
||||
{ |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
var downloadUrl = "https://github.com/" + context.Template.GithubRepository.RepositoryNameWithOrganization + "/archive/" + context.Template.Version + ".zip"; |
|
||||
|
|
||||
var credentials = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}:", context.Template.GithubRepository.AccessToken); |
|
||||
credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials)); |
|
||||
|
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); |
|
||||
client.Timeout = TimeSpan.FromMinutes(30); |
|
||||
|
|
||||
var fileContents = AsyncHelper.RunSync(() => client.GetByteArrayAsync(downloadUrl)); |
|
||||
|
|
||||
File.WriteAllBytes(context.Template.FilePath, fileContents); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//public string GetExistingVersion(ProjectBuildContext context)
|
|
||||
//{
|
|
||||
// var directoryInfo = new DirectoryInfo(templateRootPath);
|
|
||||
// var existingFileName = directoryInfo.GetFiles().FirstOrDefault(f => f.Name.StartsWith(repositoryName))?.Name;
|
|
||||
// var latestVersion = "";
|
|
||||
|
|
||||
// if (existingFileName != null)
|
|
||||
// {
|
|
||||
// var pFrom = existingFileName.IndexOf(repositoryName + "-", StringComparison.Ordinal) + (repositoryName + "-").Length;
|
|
||||
// var pTo = existingFileName.LastIndexOf(".zip", StringComparison.Ordinal);
|
|
||||
|
|
||||
// latestVersion = existingFileName.Substring(pFrom, pTo - pFrom);
|
|
||||
// }
|
|
||||
|
|
||||
// return latestVersion;
|
|
||||
//}
|
|
||||
} |
|
||||
} |
|
||||
@ -1,12 +1,12 @@ |
|||||
namespace Volo.Abp.SolutionTemplating |
namespace Volo.Abp.SolutionTemplating |
||||
{ |
{ |
||||
public class SolutionBuildResult |
public class ProjectBuildResult |
||||
{ |
{ |
||||
public byte[] ZipContent { get; } |
public byte[] ZipContent { get; } |
||||
|
|
||||
public string ProjectName { get; } |
public string ProjectName { get; } |
||||
|
|
||||
public SolutionBuildResult(byte[] zipContent, string projectName) |
public ProjectBuildResult(byte[] zipContent, string projectName) |
||||
{ |
{ |
||||
ZipContent = zipContent; |
ZipContent = zipContent; |
||||
ProjectName = projectName; |
ProjectName = projectName; |
||||
@ -1,64 +0,0 @@ |
|||||
using System; |
|
||||
using System.Diagnostics; |
|
||||
using System.IO; |
|
||||
using System.Threading.Tasks; |
|
||||
using Microsoft.AspNetCore.Hosting; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
using Volo.Abp.Domain.Repositories; |
|
||||
using Volo.Abp.SolutionTemplating.Building; |
|
||||
|
|
||||
namespace Volo.Abp.SolutionTemplating |
|
||||
{ |
|
||||
public class SolutionBuilder : ITransientDependency |
|
||||
{ |
|
||||
private readonly IHostingEnvironment _hostingEnvironment; |
|
||||
private readonly IRepository<DownloadInfo> _downloadRepository; |
|
||||
|
|
||||
public SolutionBuilder( |
|
||||
IHostingEnvironment hostingEnvironment, |
|
||||
IRepository<DownloadInfo> downloadRepository) |
|
||||
{ |
|
||||
_hostingEnvironment = hostingEnvironment; |
|
||||
_downloadRepository = downloadRepository; |
|
||||
} |
|
||||
|
|
||||
public async Task<SolutionBuildResult> BuildAsync( |
|
||||
TemplateInfo template, |
|
||||
string companyAndProjectName, |
|
||||
DatabaseProvider databaseProvider, |
|
||||
string version, |
|
||||
bool replaceLocalReferencesToNuget) |
|
||||
{ |
|
||||
var stopwatch = Stopwatch.StartNew(); |
|
||||
|
|
||||
var templateRootPath = Path.Combine(_hostingEnvironment.ContentRootPath, "TemplateFiles"); //TODO: To another folder that is not in the deployment folder!
|
|
||||
var solutionName = SolutionName.Parse(companyAndProjectName); |
|
||||
|
|
||||
var context = new ProjectBuildContext( |
|
||||
template, |
|
||||
new ProjectBuildRequest( |
|
||||
solutionName, |
|
||||
databaseProvider, |
|
||||
version |
|
||||
), |
|
||||
templateRootPath |
|
||||
); |
|
||||
|
|
||||
ProjectBuildPipelineBuilder.Build(context).Execute(context); |
|
||||
|
|
||||
stopwatch.Stop(); |
|
||||
|
|
||||
await _downloadRepository.InsertAsync( |
|
||||
new DownloadInfo( |
|
||||
solutionName.FullName, |
|
||||
template.Name, |
|
||||
databaseProvider, |
|
||||
context.Template.Version, |
|
||||
Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds) |
|
||||
) |
|
||||
); |
|
||||
|
|
||||
return new SolutionBuildResult(context.Result.ZipContent, solutionName.ProjectName); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
Loading…
Reference in new issue