diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs index 316e9e6e04..c8c28c8626 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs @@ -82,17 +82,21 @@ namespace Volo.Abp.Cli.ProjectBuilding version = latestVersion; } - - if (await GetTemplateNugetVersionAsync(name, type, version) == null) + else { - throw new Exception("There is no version found with given version: " + version); + if (!await IsVersionExists(version)) + { + throw new Exception("There is no version found with given version: " + version); + } } + var nugetVersion = await GetTemplateNugetVersionAsync(name, type, version); + if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource)) { Logger.LogInformation("Using local " + type + ": " + name + ", version: " + version); return new TemplateFile(File.ReadAllBytes(Path.Combine(templateSource, name + "-" + version + ".zip")), - version, latestVersion, version); + version, latestVersion, nugetVersion); } var localCacheFile = Path.Combine(CliPaths.TemplateCache, name.Replace("/", ".") + "-" + version + ".zip"); @@ -100,14 +104,14 @@ namespace Volo.Abp.Cli.ProjectBuilding #if DEBUG if (File.Exists(localCacheFile)) { - return new TemplateFile(File.ReadAllBytes(localCacheFile), version, latestVersion, version); + return new TemplateFile(File.ReadAllBytes(localCacheFile), version, latestVersion, nugetVersion); } #endif if (Options.CacheTemplates && File.Exists(localCacheFile) && templateSource.IsNullOrWhiteSpace()) { Logger.LogInformation("Using cached " + type + ": " + name + ", version: " + version); - return new TemplateFile(File.ReadAllBytes(localCacheFile), version, latestVersion, version); + return new TemplateFile(File.ReadAllBytes(localCacheFile), version, latestVersion, nugetVersion); } Logger.LogInformation("Downloading " + type + ": " + name + ", version: " + version); @@ -128,7 +132,7 @@ namespace Volo.Abp.Cli.ProjectBuilding File.WriteAllBytes(localCacheFile, fileContent); } - return new TemplateFile(fileContent, version, latestVersion, version); + return new TemplateFile(fileContent, version, latestVersion, nugetVersion); } private async Task GetLatestSourceCodeVersionAsync(string name, string type, string url = null, @@ -196,6 +200,30 @@ namespace Volo.Abp.Cli.ProjectBuilding } } + private async Task IsVersionExists(string version) + { + var url = $"{CliUrls.WwwAbpIo}api/download/versions?includePreReleases=true"; + + try + { + var client = _cliHttpClientFactory.CreateClient(); + + using (var response = await client.GetAsync(url, + _cliHttpClientFactory.GetCancellationToken(TimeSpan.FromMinutes(10)))) + { + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + var result = await response.Content.ReadAsStringAsync(); + var versions = JsonSerializer.Deserialize>(result); + + return versions.Any(v => v.Name == version); + } + } + catch (Exception) + { + return true; + } + } + private async Task DownloadSourceCodeContentAsync(SourceCodeDownloadInputDto input) { var url = $"{CliUrls.WwwAbpIo}api/download/{input.Type}/"; @@ -292,5 +320,16 @@ namespace Volo.Abp.Cli.ProjectBuilding { public string Version { get; set; } } + + public class GithubRelease + { + public int Id { get; set; } + + public string Name { get; set; } + + public bool IsPrerelease { get; set; } + + public DateTime PublishTime { get; set; } + } } } \ No newline at end of file