From bbbc309af2504dc694eb532a3ef9a11bc97d1f16 Mon Sep 17 00:00:00 2001
From: "1622989459@qq.com" <1622989459@qq.com>
Date: Wed, 6 May 2026 22:32:28 +0800
Subject: [PATCH] =?UTF-8?q?=E5=8E=8B=E7=BC=A9=E5=8C=85=E6=94=B9=E4=B8=B2?=
=?UTF-8?q?=E8=A1=8C=E3=80=82=E8=B0=83=E6=95=B4=E9=83=A8=E5=88=86linq?=
=?UTF-8?q?=E6=96=B9=E6=B3=95=E8=B0=83=E7=94=A8=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/Packer/Extensions/ContentExtension.cs | 2 +-
src/Packer/Extensions/FileInfoExtension.cs | 16 +++++++++++++
src/Packer/Helpers/ConfigHelpers.cs | 18 +++++++--------
src/Packer/Models/Config.cs | 4 ++--
src/Packer/Models/IResourceFileProvider.cs | 2 +-
.../Models/Providers/CompositionHelper.cs | 15 ++++++------
src/Packer/Models/Providers/McMetaProvider.cs | 2 +-
src/Packer/Models/Providers/RawFile.cs | 2 +-
.../Models/Providers/TermMappingProvider.cs | 23 ++++++++-----------
src/Packer/Models/Providers/TextFile.cs | 18 ++++++++++++---
src/Packer/Program.cs | 14 ++++++-----
src/Uploader/Program.cs | 14 +++++------
12 files changed, 77 insertions(+), 53 deletions(-)
create mode 100644 src/Packer/Extensions/FileInfoExtension.cs
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..]);
+ }
}
}
-}