Skip to content

Commit ed50c79

Browse files
authored
Merge pull request abpframework#3338 from liangshiw/liangshiwei/cli-ignore-remoteserver
Make CLI available when abp.io is offline
2 parents 7382b69 + 60ce0e9 commit ed50c79

File tree

2 files changed

+71
-20
lines changed

2 files changed

+71
-20
lines changed

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

+46-5
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
using Microsoft.Extensions.Logging.Abstractions;
33
using Microsoft.Extensions.Options;
44
using System;
5+
using System.Collections.Generic;
56
using System.IO;
7+
using System.Linq;
68
using System.Net.Http;
79
using System.Text;
10+
using System.Text.RegularExpressions;
811
using System.Threading.Tasks;
912
using Volo.Abp.Cli.Http;
13+
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
14+
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
1015
using Volo.Abp.DependencyInjection;
1116
using Volo.Abp.Http;
1217
using Volo.Abp.IO;
@@ -48,16 +53,33 @@ public async Task<TemplateFile> GetAsync(
4853
string templateSource = null)
4954
{
5055

56+
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
57+
5158
var latestVersion = await GetLatestSourceCodeVersionAsync(name, type);
5259
if (version == null)
5360
{
61+
if (latestVersion == null)
62+
{
63+
Logger.LogWarning("The remote service is currently unavailable, please specify the version.");
64+
Logger.LogWarning(string.Empty);
65+
Logger.LogWarning("Find the following template in your cache directory: ");
66+
Logger.LogWarning("\t Template Name\tVersion");
67+
68+
var templateList = GetLocalTemplates();
69+
foreach (var cacheFile in templateList)
70+
{
71+
Logger.LogWarning($"\t {cacheFile.TemplateName}\t\t{cacheFile.Version}");
72+
}
73+
74+
Logger.LogWarning(string.Empty);
75+
throw new CliUsageException("Use command: abp new Acme.BookStore -v version");
76+
}
77+
5478
version = latestVersion;
5579
}
5680

5781
var nugetVersion = (await GetTemplateNugetVersionAsync(name, type, version)) ?? version;
58-
59-
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
60-
82+
6183
if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource))
6284
{
6385
Logger.LogInformation("Using local " + type + ": " + name + ", version: " + version);
@@ -122,7 +144,7 @@ private async Task<string> GetLatestSourceCodeVersionAsync(string name, string t
122144
catch (Exception ex)
123145
{
124146
Console.WriteLine("Error occured while getting the latest version from {0} : {1}", url, ex.Message);
125-
throw;
147+
return null;
126148
}
127149
}
128150

@@ -195,11 +217,30 @@ private async Task<byte[]> DownloadSourceCodeContentAsync(SourceCodeDownloadInpu
195217
}
196218
}
197219

198-
private static bool IsNetworkSource(string source)
220+
private bool IsNetworkSource(string source)
199221
{
200222
return source.ToLower().StartsWith("http");
201223
}
202224

225+
private List<(string TemplateName, string Version)> GetLocalTemplates()
226+
{
227+
var templateList = new List<(string TemplateName, string Version)>();
228+
229+
var stringBuilder = new StringBuilder();
230+
foreach (var cacheFile in Directory.GetFiles(CliPaths.TemplateCache))
231+
{
232+
stringBuilder.AppendLine(cacheFile);
233+
}
234+
235+
var matches = Regex.Matches(stringBuilder.ToString(),$"({AppTemplate.TemplateName}|{AppProTemplate.TemplateName}|{ModuleTemplate.TemplateName}|{ModuleProTemplate.TemplateName})-(.+).zip");
236+
foreach (Match match in matches)
237+
{
238+
templateList.Add((match.Groups[1].Value, match.Groups[2].Value));
239+
}
240+
241+
return templateList;
242+
}
243+
203244
public class SourceCodeDownloadInputDto
204245
{
205246
public string Name { get; set; }

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Analyticses/CliAnalyticsCollect.cs

+25-15
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net.Http;
1+
using System;
2+
using System.Net.Http;
23
using System.Text;
34
using System.Threading.Tasks;
45
using Microsoft.Extensions.Logging;
@@ -32,27 +33,36 @@ public CliAnalyticsCollect(
3233
public async Task CollectAsync(CliAnalyticsCollectInputDto input)
3334
{
3435
var postData = _jsonSerializer.Serialize(input);
35-
using (var client = new CliHttpClient())
36+
var url = $"{CliUrls.WwwAbpIo}api/clianalytics/collect";
37+
38+
try
3639
{
37-
var responseMessage = await client.PostAsync(
38-
$"{CliUrls.WwwAbpIo}api/clianalytics/collect",
39-
new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
40-
_cancellationTokenProvider.Token
41-
);
42-
43-
if (!responseMessage.IsSuccessStatusCode)
40+
using (var client = new CliHttpClient())
4441
{
45-
var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. ";
46-
var remoteServiceErrorMessage = await _remoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage);
42+
var responseMessage = await client.PostAsync(
43+
url,
44+
new StringContent(postData, Encoding.UTF8, MimeTypes.Application.Json),
45+
_cancellationTokenProvider.Token
46+
);
4747

48-
if (remoteServiceErrorMessage != null)
48+
if (!responseMessage.IsSuccessStatusCode)
4949
{
50-
exceptionMessage += remoteServiceErrorMessage;
51-
}
50+
var exceptionMessage = "Remote server returns '" + (int)responseMessage.StatusCode + "-" + responseMessage.ReasonPhrase + "'. ";
51+
var remoteServiceErrorMessage = await _remoteServiceExceptionHandler.GetAbpRemoteServiceErrorAsync(responseMessage);
52+
53+
if (remoteServiceErrorMessage != null)
54+
{
55+
exceptionMessage += remoteServiceErrorMessage;
56+
}
5257

53-
_logger.LogInformation(exceptionMessage);
58+
_logger.LogInformation(exceptionMessage);
59+
}
5460
}
5561
}
62+
catch (Exception ex)
63+
{
64+
// ignored
65+
}
5666
}
5767
}
5868
}

0 commit comments

Comments
 (0)