diff --git a/src/Packer/Extensions/ContentExtension.cs b/src/Packer/Extensions/ContentExtension.cs index 936e0cfab327..49247dea6251 100644 --- a/src/Packer/Extensions/ContentExtension.cs +++ b/src/Packer/Extensions/ContentExtension.cs @@ -107,7 +107,7 @@ public static string LogToDebug(this string message) /// public static string ComputeMD5(this Stream stream) { - stream.Seek(0, SeekOrigin.Begin); // 确保文件流的位置被重置 + stream.Position = 0; // 确保文件流的位置被重置 return Convert.ToHexString(MD5.Create().ComputeHash(stream)); } } diff --git a/src/Packer/Extensions/FileInfoExtension.cs b/src/Packer/Extensions/FileInfoExtension.cs new file mode 100644 index 000000000000..c6abb2b07c82 --- /dev/null +++ b/src/Packer/Extensions/FileInfoExtension.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Packer.Extensions; + +internal static class FileInfoExtension +{ + public static string ReadAllText(this FileInfo file) + { + using var stream = file.OpenText(); + var text = stream.ReadToEnd(); + return text; + } +} diff --git a/src/Packer/Helpers/ConfigHelpers.cs b/src/Packer/Helpers/ConfigHelpers.cs index 7ca78ba37375..153ff9e0f642 100644 --- a/src/Packer/Helpers/ConfigHelpers.cs +++ b/src/Packer/Helpers/ConfigHelpers.cs @@ -25,13 +25,13 @@ public static class ConfigHelpers { var configFile = directory.GetFiles("local-config.json").FirstOrDefault(); - if (configFile is null) return null; + if (configFile is null) + return null; configFile.FullName.LogToDebug("读取文件:{0}"); - - using var reader = configFile.OpenText(); + return JsonSerializer.Deserialize( - reader.ReadToEnd().LogToDebug(), + configFile.ReadAllText().LogToDebug(), new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); } @@ -48,10 +48,11 @@ public static async Task RetrieveConfig(string configTemplate, string ve Log.Information("配置位置:{0}", configPath); - var content = await File.ReadAllBytesAsync(configPath); - return JsonSerializer.Deserialize( + await using var content = File.OpenRead(configPath); + + return (await JsonSerializer.DeserializeAsync( content, - new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase })!; + new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }))!; } /// @@ -72,9 +73,8 @@ public static List RetrievePolicy(DirectoryInfo directory) file.FullName.LogToDebug("读取文件:{0}"); - using var reader = file.OpenText(); var result = JsonSerializer.Deserialize>( - reader.ReadToEnd().LogToDebug(), + file.ReadAllText().LogToDebug(), new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, diff --git a/src/Packer/Models/Config.cs b/src/Packer/Models/Config.cs index 85e7262a901f..58c202a2aee7 100644 --- a/src/Packer/Models/Config.cs +++ b/src/Packer/Models/Config.cs @@ -121,9 +121,9 @@ public class FloatingConfig InclusionDomains = InclusionDomains.Concat(other.InclusionDomains).Distinct(), InclusionPaths = InclusionPaths.Concat(other.InclusionPaths).Distinct(), CharacterReplacement = CharacterReplacement.Concat(other.CharacterReplacement).DistinctBy(_ => _.Key) - .ToDictionary(_ => _.Key, _ => _.Value), + .ToDictionary(), DestinationReplacement = DestinationReplacement.Concat(other.DestinationReplacement).DistinctBy(_ => _.Key) - .ToDictionary(_ => _.Key, _ => _.Value) + .ToDictionary() }; diff --git a/src/Packer/Models/IResourceFileProvider.cs b/src/Packer/Models/IResourceFileProvider.cs index 521c0470c939..bef7956ca933 100644 --- a/src/Packer/Models/IResourceFileProvider.cs +++ b/src/Packer/Models/IResourceFileProvider.cs @@ -47,7 +47,7 @@ public IResourceFileProvider ReplaceContent(string searchPattern, string replace /// /// /// 资源包中已有同名文件 - public Task WriteToArchive(ZipArchive archive); + public Task WriteToArchiveAsync(ZipArchive archive); /// /// 目标在资源包中的相对位置,从根目录算起 diff --git a/src/Packer/Models/Providers/CompositionHelper.cs b/src/Packer/Models/Providers/CompositionHelper.cs index ebcd6ebf7213..79b56225a2cc 100644 --- a/src/Packer/Models/Providers/CompositionHelper.cs +++ b/src/Packer/Models/Providers/CompositionHelper.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using Packer.Extensions; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; @@ -16,10 +17,9 @@ public static partial class LangMappingHelper /// /// 组合文件 public static LangMappingProvider CreateFromComposition(FileInfo file) - { - using var reader = file.OpenText(); + { var data = JsonSerializer.Deserialize( - reader.ReadToEnd(), + file.ReadAllText(), new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); return new LangMappingProvider( new LangDictionaryWrapper(CompositionHelper.CreateRawDictionary(data)), @@ -34,10 +34,9 @@ public static partial class JsonMappingHelper /// /// 组合文件 public static JsonMappingProvider CreateFromComposition(FileInfo file) - { - using var reader = file.OpenText(); + { var data = JsonSerializer.Deserialize( - reader.ReadToEnd(), + file.ReadAllText(), new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); return new JsonMappingProvider( JsonDictionaryWrapper.Create(CompositionHelper.CreateRawDictionary(data)), @@ -67,7 +66,7 @@ internal static IEnumerable, IEnumerable(), Enumerable.Empty()) } as IEnumerable, IEnumerable>>, // 这都需要手写... (accumulate, next) => from incomingPair in next - join existingGroup in accumulate on true equals true + from existingGroup in accumulate select KeyValuePair.Create( existingGroup.Key.Append(incomingPair.Key), existingGroup.Value.Append(incomingPair.Value))); diff --git a/src/Packer/Models/Providers/McMetaProvider.cs b/src/Packer/Models/Providers/McMetaProvider.cs index 0ad3431f2f4a..3112d4cac9dc 100644 --- a/src/Packer/Models/Providers/McMetaProvider.cs +++ b/src/Packer/Models/Providers/McMetaProvider.cs @@ -37,7 +37,7 @@ public override IResourceFileProvider ReplaceContent(string searchPattern, strin public override IResourceFileProvider ReplaceDestination(string searchPattern, string replacement) => this; /// - public override async Task WriteToArchive(ZipArchive archive) + public override async Task WriteToArchiveAsync(ZipArchive archive) { var destination = Destination.NormalizePath(); Log.Debug("[McMetaProvider]写入路径 {0}", destination); diff --git a/src/Packer/Models/Providers/RawFile.cs b/src/Packer/Models/Providers/RawFile.cs index 1c282d7242d2..72dfd6a80f1a 100644 --- a/src/Packer/Models/Providers/RawFile.cs +++ b/src/Packer/Models/Providers/RawFile.cs @@ -44,7 +44,7 @@ public IResourceFileProvider ReplaceDestination(string searchPattern, string rep RegexOptions.Singleline)); /// - public async Task WriteToArchive(ZipArchive archive) + public async Task WriteToArchiveAsync(ZipArchive archive) { var destination = Destination.NormalizePath(); Log.Debug("[RawFile]写入路径 {0}", destination); diff --git a/src/Packer/Models/Providers/TermMappingProvider.cs b/src/Packer/Models/Providers/TermMappingProvider.cs index 3566b0470e7c..0fad58f43e7b 100644 --- a/src/Packer/Models/Providers/TermMappingProvider.cs +++ b/src/Packer/Models/Providers/TermMappingProvider.cs @@ -84,14 +84,13 @@ public ITermDictionary ReplaceContent(string searchPattern, string rep var result = new Dictionary(); foreach (var (key, value) in this) { - if (value is JsonValue jsonValue - && jsonValue.TryGetValue(out var stringValue)) + if (value.GetValueKind() == JsonValueKind.String) { - var replaced = Regex.Replace(stringValue, + var replaced = Regex.Replace(value.GetValue(), searchPattern, replacement, RegexOptions.Singleline); - result.Add(key, JsonValue.Create(replaced)!); // 我猜不会null罢 + result.Add(key, JsonValue.Create(replaced)); // 我猜不会null罢 continue; } result.Add(key, value); @@ -101,12 +100,8 @@ public ITermDictionary ReplaceContent(string searchPattern, string rep public static ITermDictionary Create(IDictionary nominalMapping) { - var query = from pair in nominalMapping - let key = pair.Key - let value = pair.Value - let node = JsonValue.Create(value)! - select (key, node); - var transformed = query.ToDictionary(_ => _.key, _ => _.node as JsonNode); + var transformed = nominalMapping + .ToDictionary(p => p.Key, p => JsonValue.Create(p.Value) as JsonNode); return new JsonDictionaryWrapper(transformed); } } @@ -145,7 +140,8 @@ public TermMappingProvider(ITermDictionary map, string destination) /// public IResourceFileProvider ApplyTo(IResourceFileProvider? baseProvider, ApplyOptions options) { - if (baseProvider is null) return this; + if (baseProvider is null) + return this; if (baseProvider is not TermMappingProvider baseMapping) throw new ArgumentException($"Argument not an instance of {typeof(TermMappingProvider)}.", @@ -190,7 +186,7 @@ public IResourceFileProvider ReplaceDestination(string searchPattern, string rep RegexOptions.Singleline)); /// - public async Task WriteToArchive(ZipArchive archive) + public async Task WriteToArchiveAsync(ZipArchive archive) { var destination = Destination.NormalizePath(); Log.Debug("[TermMappingProvider`1]写入路径 {0}", destination); @@ -287,7 +283,8 @@ internal static Dictionary DeserializeFromLang(string content) var splitPosition = line.IndexOf('='); // https://github.com/CFPAOrg/Minecraft-Mod-Language-Package/pull/3272/files#r1461545452 - if (splitPosition == -1) continue; + if (splitPosition == -1) + continue; var key = line[..splitPosition]; var value = splitPosition + 1 < line.Length diff --git a/src/Packer/Models/Providers/TextFile.cs b/src/Packer/Models/Providers/TextFile.cs index 4745375c2da7..5df291b395de 100644 --- a/src/Packer/Models/Providers/TextFile.cs +++ b/src/Packer/Models/Providers/TextFile.cs @@ -38,6 +38,16 @@ public static TextFile Create(FileInfo file, string destination) return new TextFile(content, destination); } + /// + /// 从给定的构造提供器 + /// + /// 读取源 + /// 目标地址 + public static TextFile Create(string path, string destination) + { + return new TextFile(File.ReadAllText(path), destination); + } + /// /// 从给定的模板和参数构造提供器 /// @@ -67,9 +77,11 @@ public TextFile(string content, string destination) /// public virtual IResourceFileProvider ApplyTo(IResourceFileProvider? baseProvider, ApplyOptions options) { - if (baseProvider is null) return this; + if (baseProvider is null) + return this; - if (!options.Append) return baseProvider; + if (!options.Append) + return baseProvider; if (baseProvider is not TextFile baseTextFile) throw new ArgumentException($"Argument not an instance of {typeof(TextFile)}.", @@ -94,7 +106,7 @@ public virtual IResourceFileProvider ReplaceDestination(string searchPattern, st replacement, RegexOptions.Singleline)); /// - public virtual async Task WriteToArchive(ZipArchive archive) + public virtual async Task WriteToArchiveAsync(ZipArchive archive) { var destination = Destination.NormalizePath(); Log.Debug("[TextFile]写入路径 {0}", destination); diff --git a/src/Packer/Program.cs b/src/Packer/Program.cs index 7d82acc7b8c4..24bf39da30aa 100644 --- a/src/Packer/Program.cs +++ b/src/Packer/Program.cs @@ -34,7 +34,7 @@ public static async Task Main(string version, bool increment = false) // ./projects/assets/... from modDirectory in new DirectoryInfo("./projects/assets").EnumerateDirectories() let modIdentifier = modDirectory.Name - where targetModIdentifiers.Count() == 0 // 未提供列表,全部打包 + where !targetModIdentifiers.Any() // 未提供列表,全部打包 || targetModIdentifiers.Contains(modIdentifier) // 有列表,仅打包列表中的项 // .../ let versionedDirectory = modDirectory.GetDirectories(config.Base.Version).FirstOrDefault(defaultValue: null) @@ -43,7 +43,7 @@ where versionedDirectory is not null from namespaceDirectory in versionedDirectory.EnumerateDirectories() let namespaceName = namespaceDirectory.Name where !config.Base.ExclusionNamespaces.Contains(namespaceName) // 没有被明确排除 - where namespaceName.ValidateNamespace() // 不是非法名称 + && namespaceName.ValidateNamespace() // 不是非法名称 // .../* from provider in namespaceDirectory.EnumerateProviders(config) group provider by provider.Destination into destinationGroup @@ -67,7 +67,7 @@ select config.Floating.DestinationReplacement // 全局路 IEnumerable initialFiles = [ new RawFile(new FileInfo("./projects/templates/pack.png"), "pack.png"), - TextFile.Create(new FileInfo("./projects/templates/LICENSE"), "LICENSE"), + TextFile.Create("./projects/templates/LICENSE", "LICENSE"), TextFile.CreateFromTemplate(new FileInfo(config.Base.ReadmeTemplate), "README.txt", config.Base.ReadmeParameters), @@ -80,9 +80,11 @@ select config.Floating.DestinationReplacement // 全局路 await using var stream = File.Create(packName); using (var archive = new ZipArchive(stream, ZipArchiveMode.Update, leaveOpen: true)) - { - await Task.WhenAll(from provider in query.Concat(initialFiles) - select provider.WriteToArchive(archive)); + { + foreach (var item in query.Concat(initialFiles)) + { + await item.WriteToArchiveAsync(archive); + } } Log.Information("对版本 {0} 的打包结束。", version); diff --git a/src/Uploader/Program.cs b/src/Uploader/Program.cs index f3675e993c1d..197331b15508 100644 --- a/src/Uploader/Program.cs +++ b/src/Uploader/Program.cs @@ -1,10 +1,9 @@ -using Renci.SshNet; +using Renci.SshNet; using Serilog; using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Security.Cryptography; using System.Threading.Tasks; using Octokit; @@ -130,13 +129,12 @@ async static Task UpdateAutobuildAssets(GitHubClient client, IEnumerable<(string await client.Repository.Release.Edit(repoId, release.Id, desc); Log.Information(" 更新 Release 简介:时间 {0}", timestamp); - var assets = release.Assets; - var lookup = assets.Select(_ => (_.Name, _)).ToDictionary(); + var lookup = release.Assets.ToDictionary(r => r.Name, r => r); foreach (var (name, file) in files) { using var fileStream = file.OpenRead(); - if (lookup.TryGetValue(name, out ReleaseAsset? asset)) + if (lookup.TryGetValue(name, out ReleaseAsset? asset)) { await client.Repository.Release.DeleteAsset(repoId, asset.Id); Log.Information(" 删除旧文件:{0}", name); @@ -153,7 +151,7 @@ async static Task UpdateAutobuildAssets(GitHubClient client, IEnumerable<(string timeout: null); await client.Repository.Release.UploadAsset(release, newAsset); Log.Information(" 上传文件:{0}", name); - + } } @@ -168,9 +166,9 @@ public static string RegulateFileName(this string fileName) string CapitalizeGroup(string[] texts) => string.Join('-', texts.Select(_ => Capitalize(_))); // 将一段文本的首字母大写,其余不动 - string Capitalize(string text) => string.Join("", + string Capitalize(string text)=>string.Concat( text[0..1].ToUpper(), text[1..]); + } } } -}