From 3632c06f451fd76e7c7e7944b43fa06f3d9f0f3f Mon Sep 17 00:00:00 2001 From: lindexi Date: Sun, 28 Apr 2024 14:05:17 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E6=89=93=E5=8C=85=E6=97=B6=E5=B8=A6=E4=B8=8A=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Build/package.targets | 5 ++++ DebUOS/Packaging.DebUOS.Tool/Program.cs | 4 ++- .../Configurations/DebUOSConfiguration.cs | 15 +++++++++++ .../DebUOSConfigurationExtension.cs | 25 +++++++++++++++++++ .../Packaging.DebUOS/DebUOSPackageCreator.cs | 6 +++-- DebUOS/Packaging.Targets/ArchiveBuilder.cs | 16 +++++++++--- 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfigurationExtension.cs diff --git a/DebUOS/Packaging.DebUOS.NuGet/Build/package.targets b/DebUOS/Packaging.DebUOS.NuGet/Build/package.targets index d2f1798..31cb8e6 100644 --- a/DebUOS/Packaging.DebUOS.NuGet/Build/package.targets +++ b/DebUOS/Packaging.DebUOS.NuGet/Build/package.targets @@ -278,6 +278,11 @@ + + + + + diff --git a/DebUOS/Packaging.DebUOS.Tool/Program.cs b/DebUOS/Packaging.DebUOS.Tool/Program.cs index 4a27d54..f007948 100644 --- a/DebUOS/Packaging.DebUOS.Tool/Program.cs +++ b/DebUOS/Packaging.DebUOS.Tool/Program.cs @@ -53,9 +53,11 @@ var packingFolder = new DirectoryInfo(configuration.PackingFolder!); var outputDebFile = new FileInfo(configuration.DebUOSOutputFilePath!); var workingFolder = new DirectoryInfo(configuration.WorkingFolder!); + var excludePackingDebFileExtensionsPredicate = configuration.ToExcludePackingDebFileExtensionsPredicate(); var debUosPackageCreator = new DebUOSPackageCreator(logger); - debUosPackageCreator.PackageDeb(packingFolder, outputDebFile, workingFolder); + debUosPackageCreator.PackageDeb(packingFolder, outputDebFile, workingFolder, + optFileCanIncludePredicate: entry => /*取反,因为配置是不包括*/ !excludePackingDebFileExtensionsPredicate(entry)); } else { diff --git a/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfiguration.cs b/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfiguration.cs index d75848b..cd5154e 100644 --- a/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfiguration.cs +++ b/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfiguration.cs @@ -522,4 +522,19 @@ public string? Png512x512IconFile set => SetValue(value); get => GetString(); } + + #region 打包控制相关 + + /// + /// 打包时应该有哪些后缀被排除,默认包括 .pdb .dbg .md 文件 + /// 如果有其他特殊规则,请自行编写 Target 在 CreateDebUOS 之前删除掉 + /// + /// .pdb;.dbg;.md + public string? ExcludePackingDebFileExtensions + { + set => SetValue(value); + get => GetString() ?? ".pdb;.dbg;.md"; + } + + #endregion } \ No newline at end of file diff --git a/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfigurationExtension.cs b/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfigurationExtension.cs new file mode 100644 index 0000000..80b6737 --- /dev/null +++ b/DebUOS/Packaging.DebUOS/Contexts/Configurations/DebUOSConfigurationExtension.cs @@ -0,0 +1,25 @@ +using System; +using System.IO; +using System.Linq; + +namespace Packaging.DebUOS.Contexts.Configurations; + +public static class DebUOSConfigurationExtension +{ + public static Predicate ToExcludePackingDebFileExtensionsPredicate(this DebUOSConfiguration configuration) + { + var excludePackingDebFileExtensions = configuration.ExcludePackingDebFileExtensions; + var extensions = excludePackingDebFileExtensions?.Split(';'); + if (extensions is null || extensions.Length == 0) + { + return static _ => true; + } + + return entry => + { + var file = entry; + var extension = Path.GetExtension(file); + return extensions.Contains(extension); + }; + } +} \ No newline at end of file diff --git a/DebUOS/Packaging.DebUOS/DebUOSPackageCreator.cs b/DebUOS/Packaging.DebUOS/DebUOSPackageCreator.cs index 90bde43..12baa0a 100644 --- a/DebUOS/Packaging.DebUOS/DebUOSPackageCreator.cs +++ b/DebUOS/Packaging.DebUOS/DebUOSPackageCreator.cs @@ -26,7 +26,8 @@ public DebUOSPackageCreator(ILogger logger) public ILogger Logger { get; } - public void PackageDeb(DirectoryInfo packingFolder, FileInfo outputDebFile, DirectoryInfo? workingFolder = null) + public void PackageDeb(DirectoryInfo packingFolder, FileInfo outputDebFile, DirectoryInfo? workingFolder = null, + Predicate? optFileCanIncludePredicate = null) { Logger.LogInformation($"开始打包。Start packaging UOS deb from '{packingFolder.FullName}' to '{outputDebFile.FullName}'"); @@ -38,10 +39,11 @@ public void PackageDeb(DirectoryInfo packingFolder, FileInfo outputDebFile, Dire var optFolder = Path.Combine(packingFolder.FullName, "opt"); + // 压缩文件夹里面的文件 var archiveEntries = archiveBuilder.FromDirectory( optFolder, null, - "/opt"); + "/opt", optFileCanIncludePredicate); EnsureDirectories(archiveEntries); diff --git a/DebUOS/Packaging.Targets/ArchiveBuilder.cs b/DebUOS/Packaging.Targets/ArchiveBuilder.cs index 79c9d15..b7f9e36 100644 --- a/DebUOS/Packaging.Targets/ArchiveBuilder.cs +++ b/DebUOS/Packaging.Targets/ArchiveBuilder.cs @@ -198,13 +198,15 @@ public List FromCpio(CpioFile file) /// /// Additional metadata to use. /// + /// 文件是否能够被包含,为空则全部包含 /// /// A list of objects representing the data in the directory. /// - public List FromDirectory(string directory, string? appHost, string prefix/*, ITaskItem[] metadata*/) +#nullable enable + public List FromDirectory(string directory, string? appHost, string prefix/*, ITaskItem[] metadata*/, Predicate? fileCanIncludePredicate) { List value = new List(); - this.AddDirectory(directory, string.Empty, prefix, value/*, metadata*/); + this.AddDirectory(directory, string.Empty, prefix, value/*, metadata*/, fileCanIncludePredicate); // Add a symlink to appHost, if available if (appHost != null) @@ -226,7 +228,7 @@ public List FromDirectory(string directory, string? appHost, strin return value; } - protected void AddDirectory(string directory, string relativePath, string prefix, List value/*, ITaskItem[] metadata*/) + protected void AddDirectory(string directory, string relativePath, string prefix, List value/*, ITaskItem[] metadata*/, Predicate? fileCanIncludePredicate) { this._inode++; @@ -239,11 +241,17 @@ protected void AddDirectory(string directory, string relativePath, string prefix { if (File.Exists(entry)) { + if (fileCanIncludePredicate is not null && !fileCanIncludePredicate(entry)) + { + // 如果不能被包含的,则忽略 + continue; + } + this.AddFile(entry, relativePath + Path.GetFileName(entry), prefix, value/*, metadata*/); } else { - this.AddDirectory(entry, relativePath + Path.GetFileName(entry) + "/", prefix + "/" + Path.GetFileName(entry), value/*, metadata*/); + this.AddDirectory(entry, relativePath + Path.GetFileName(entry) + "/", prefix + "/" + Path.GetFileName(entry), value/*, metadata*/, fileCanIncludePredicate); } } } From e093d70153694c299dac32756ab5d77ca539e1ec Mon Sep 17 00:00:00 2001 From: lindexi Date: Sun, 28 Apr 2024 14:57:49 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DebUOS/Packaging.DebUOS/Packaging.DebUOS.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DebUOS/Packaging.DebUOS/Packaging.DebUOS.csproj b/DebUOS/Packaging.DebUOS/Packaging.DebUOS.csproj index d05ca82..1fde0ad 100644 --- a/DebUOS/Packaging.DebUOS/Packaging.DebUOS.csproj +++ b/DebUOS/Packaging.DebUOS/Packaging.DebUOS.csproj @@ -13,7 +13,7 @@ - + all @@ -22,7 +22,7 @@ - + From 2a65121cea5d091259673f5cbd6f89031710bfce Mon Sep 17 00:00:00 2001 From: lindexi Date: Sun, 28 Apr 2024 15:02:57 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E5=BA=93=E7=9A=84=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F=E5=B0=9D=E8=AF=95=E4=BC=98=E5=8C=96=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=E9=87=8D=E6=96=B0=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unhandled exception. System.UnauthorizedAccessException: Access to the path 'bin' is denied. at System.IO.FileSystem.RemoveDirectoryRecursive(String fullPath, WIN32_FIND_DATA& findData, Boolean topLevel) at System.IO.FileSystem.RemoveDirectory(String fullPath, Boolean recursive) at System.IO.Directory.Delete(String path, Boolean recursive) --- .../DebUOSPackageFileStructCreator.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/DebUOS/Packaging.DebUOS/DebUOSPackageFileStructCreator.cs b/DebUOS/Packaging.DebUOS/DebUOSPackageFileStructCreator.cs index a7b5944..0da3b14 100644 --- a/DebUOS/Packaging.DebUOS/DebUOSPackageFileStructCreator.cs +++ b/DebUOS/Packaging.DebUOS/DebUOSPackageFileStructCreator.cs @@ -29,6 +29,11 @@ public DebUOSPackageFileStructCreator(ILogger logger) public ILogger Logger { get; } + /// + /// 创建符合 UOS 安装包制作规范的打包文件夹,后续此文件夹完全支持 dpkg 工具直接打包 + /// + /// + /// public void CreatePackagingFolder(DebUOSConfiguration configuration) { var projectPublishFolder = configuration.ProjectPublishFolder; @@ -56,13 +61,18 @@ public void CreatePackagingFolder(DebUOSConfiguration configuration) // 删除旧的文件夹,防止打包使用到旧文件 if (Directory.Exists(packingFolder)) { - // 这里不能使用 PackageDirectory.Delete 进行删除文件,因为可能里面建立了符号链接。这将导致错误删除了原本 bin 文件夹下的发布输出的文件 - Directory.Delete(packingFolder, true); + PackageDirectory.Delete(packingFolder); } Directory.CreateDirectory(packingFolder); configuration.PackingFolder = packingFolder; + if (File.Exists(configuration.DebUOSOutputFilePath)) + { + // 如果存在输出文件,则先删除,防止后续又将其加入压缩文件 + File.Delete(configuration.DebUOSOutputFilePath); + } + var appId = configuration.UOSAppId; if (string.IsNullOrEmpty(appId)) {