文件夹对比-生成同级差异patch

本文介绍了一种在Kodi项目中进行定制修改并生成补丁(patch)的方法。该方法利用bash脚本自动对比基准代码与修改后的代码,并将差异部分以文件夹形式保存,便于后续比较与整合。

最近一段时间研究kodi,需要做一些定制修改,由于kodi对g++ 版本的要求,只能在本地编译集成,没整成git去管理,所以打算以kodi官方release版code为基准 ,任何改动的文件作为patch,只把patch git管理起来,方便同步整合到其它版本

打算以文件夹形式保存改动过的文件,也方便之后的Beyondcompare对比,找了一下没有什么好工具可以直接对比抽出patch,只有自己动手了,记录脚本如下:

#author :jscese
# $1 - source code
# $2 - modify code
# $1 and $2 Have the same target directory  -example: ./diff_patch.sh  xxx/xxx/kodi_***/addons  xxx/kodi_***/addons
# the script create patch_directory<$patch_name> in current derectory
#!/bin/bash
basedir="./"
patch_name="kodi_modif_patch"
dir1=$1
dir2=$2
dir3="$(echo $dir1 | sed "s/^[^\/]*/${patch_name}/")"
diff_out="diff_between_patch.log"
echo "$dir1  $patch_name  $dir3"
tempf="$(mktemp -p $basedir)"
find $PWD/$dir1 -type f >$tempf
if [ -f "${diff_out}" ];then
        mv "${diff_out}" "${diff_out}-$(date +%H%M%S)"
fi
if [ -d "${patch_name}" ];then
        echo "already exit patch"
        rm -rf ${patch_name}

fi

if [ -z "$tempf" ];then
        exit 1
fi
echo "begain check"
for myfile in $(cat $tempf)
do
        myfile2="$(echo $myfile | sed "s:$dir1:$dir2:")"
        if [ -f "$myfile2" ];then
             cmp -s $myfile $myfile2
             return_value=$?
             if [ "$return_value" == 1 ];then
              #diff -u $myfile $myfile2 | tee -a "$diff_out"
              myfile3="$(echo $myfile | sed "s:$dir1:$dir3:")"
              targdir=$(dirname $myfile3)
              mkdir -p $targdir
              cp -fp $myfile2 $myfile3
             fi
        else
                echo "$myfile2 not exist!"
        fi
done    
rm -f $tempf

脚本运行需要传入基准源目录 和 修改过的工程目录, 同级目录,对比生成的patch 才有意义

以find 首先遍历基准源目录 ,取出所有文件路径保存起来,如果觉得这个操作费时 ,第一次后可以不rm,以后每次check ,如果存在直接读取用

sed 命令替换我们想要的路径,第一个sed 通过替换制作我们最终patch文件需要的路径,第二个sed 根据源目录去得到修改工程对应的文件,找不到的就不作为patch,有差异的就认定位patch,因变量为路径会有”/” ,不好用转义 \ ,所以用的 : 分割,也可用#

通过 cmp 比对目录下所有文件,返回值 1 为不同, 0 为相同,如果目录下文件太多 ,可依次分层对比

cp 文件作为保存改动的文件, 如果需要同步

cp -rfp kodi_modif_patch/*  source_code/

一样 也需要同级目录。

<think>我们之前已经将VitePress的dist文件夹放在项目根目录,并在发布时复制到publish目录。现在用户希望dist文件夹的内容输出到publish文件夹内部(即成为publish文件夹的一部分),并且能够通过根路径访问。 实际上,我们之前的配置已经将dist文件夹复制到了publish目录中(通过`.csproj`中的配置)。但是,在运行程序时,我们需要确保程序能够正确找到dist文件夹的位置,因为发布后程序的工作目录是publish文件夹。 回顾之前`Program.cs`中的配置: ```csharp app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, "dist")), // 指向 dist 文件夹 RequestPath = "" }); ``` 这里`builder.Environment.ContentRootPath`是项目的根目录,在发布后,这个目录就是publish文件夹。因此,我们只需要在发布时将dist文件夹复制到publish文件夹内,程序就会自动从publish文件夹内的dist目录提供静态文件。 所以,我们不需要修改代码,只需要确保发布流程正确复制dist文件夹到publish文件夹即可。 但是,用户可能希望调整发布过程,使得dist文件夹在publish文件夹中的位置更符合预期(比如放在publish文件夹内的某个子目录)?但根据用户描述,他们希望输出到publish文件夹内部,也就是成为publish文件夹的一部分,而目前我们的配置就是复制到publish文件夹的根目录下的dist文件夹。 因此,我们只需要确保在发布过程中dist文件夹被正确复制到publish文件夹内。而我们在`.csproj`中已经配置了: ```xml <ItemGroup> <Content Include="dist\**" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> ``` 这个配置会将dist文件夹下的所有内容复制到publish文件夹的dist目录下。 因此,发布后的目录结构如下: ``` publish/ dist/ # VitePress生成的静态文件 index.html assets/ ... app.dll # 应用程序 app.exe # 可执行文件(如果是自包含发布) web.config # IIS配置文件 ... # 其他依赖文件 ``` 这样,当应用程序启动时,它会从`ContentRootPath`(即publish文件夹)下的dist目录提供静态文件。 但是,如果用户希望将dist文件夹的内容直接放在publish文件夹的根目录下(而不是在dist子目录中),那么我们需要调整: 1. 修改静态文件中间件的路径,直接指向publish文件夹(即`ContentRootPath`),而不是dist子目录。 2. 将dist文件夹内的所有内容复制到publish文件夹的根目录,而不是dist子目录。 但是,这样会使得静态文件与应用程序文件混在一起,可能不是最佳实践。而且,VitePress生成的dist文件夹通常包含index.html和assets等,这些文件与应用程序的dll、exe等放在一起可能会造成混乱。 因此,我理解用户的需求可能是希望将静态内容整合到发布文件夹中,但保持原有结构。我们目前的做法(dist文件夹在publish文件夹内)是合理的。 如果用户确实希望将dist文件夹的内容直接放在publish根目录下(不推荐),可以这样做: **步骤1:修改项目文件,将dist文件夹的内容复制到publish根目录** 在`.csproj`中,我们可以将dist文件夹的内容复制到发布目录的根目录: ```xml <ItemGroup> <!-- 将dist文件夹下的所有内容复制到发布目录的根目录 --> <Content Include="dist\**"> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <TargetPath>%(Filename)%(Extension)</TargetPath> </Content> </ItemGroup> ``` 但是,这样会覆盖发布目录中的其他文件(比如app.dll),因为index.html会覆盖任何同名的文件(通常不会同名,但要注意)。 因此,更安全的方式是只复制dist文件夹的内容,并且确保没有重名文件。或者,我们可以将dist文件夹的内容复制到publish根目录下的一个子目录(比如`static`),然后修改静态文件中间件指向该子目录。 但是,根据用户的问题,他们希望将dist输出到publish文件夹内部,这已经是我们当前的做法(dist文件夹在publish内部)。所以,我认为当前配置已经满足要求。 综上所述,我们不需要修改代码,只需确保发布流程正确即可。 如果用户希望调整静态文件在publish文件夹中的位置,比如希望将dist文件夹改名为`wwwroot`,则可以: 1. 将dist文件夹改名为wwwroot(或者任何其他名称),然后修改`Program.cs`中的路径: ```csharp app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, "wwwroot")), // 修改为新的文件夹名 RequestPath = "" }); ``` 2. 在项目文件中更新复制规则: ```xml <ItemGroup> <Content Include="wwwroot\**" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> ``` 这样,发布后publish文件夹内会有一个wwwroot文件夹存放静态文件。 但是,用户的问题中并没有要求改名,所以我们可以保持为dist。 因此,按照用户最初的要求,我们保持配置不变,发布后dist文件夹就在publish文件夹内部。 下面,我将总结完整的步骤,并确保dist文件夹被正确复制到publish文件夹内部。 步骤: 1. 在项目根目录创建dist文件夹(存放VitePress生成的静态文件)。 2. 配置项目文件(.csproj)以包含dist文件夹并复制到发布目录。 3. 在Program.cs中配置静态文件中间件,指向dist文件夹。 4. 发布项目,发布后的publish文件夹内会包含dist文件夹。 这样,当应用程序在IIS上运行时,静态文件就会从dist文件夹提供。 注意:在本地开发时,需要确保dist文件夹存在(或者通过构建VitePress项目生成),否则运行时会报错。 如果用户希望在发布过程中自动生成dist(即构建VitePress项目),那么可以在.csproj中添加一个目标(Target),在发布前执行构建VitePress的命令。但这需要用户环境中有Node.js和VitePress。 例如,在.csproj中添加: ```xml <Target Name="BuildVitePress" BeforeTargets="BeforePublish"> <Exec Command="npm run build" WorkingDirectory="$(ProjectDir)" /> </Target> ``` 这将在发布前在项目目录中执行`npm run build`(假设package.json中已经配置了build脚本为构建VitePress)。 但是,这超出了当前问题的范围。我们只关注如何将已有的dist文件夹输出到publish内部。 因此,最终配置如下: **项目文件 (.csproj):** ```xml <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <PublishAot>true</PublishAot> <InvariantGlobalization>true</InvariantGlobalization> </PropertyGroup> <ItemGroup> <!-- 将dist文件夹内容复制到发布目录的dist文件夹--> <Content Include="dist\**" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> </Project> ``` **Program.cs:** ```csharp var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, "dist")), RequestPath = "" }); app.MapFallbackToFile("index.html", new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(builder.Environment.ContentRootPath, "dist")) }); app.MapControllers(); app.Run(); ``` 发布命令: ```bash dotnet publish -c Release -r win-x64 --self-contained ``` 发布后,在IIS中配置网站指向publish文件夹即可。 这样,VitePress的静态文件就会从publish文件夹内部的dist目录提供。 相关问题: 1. 如何配置VitePress在构建时输出到.NET项目的dist文件夹? 2. 在.NET项目中使用静态文件中间件时,如何设置默认文档(如index.html)? 3. 如何为VitePress生成的静态文件配置缓存策略?</think>要将 VitePress 生成的 `dist` 文件夹集成到 .NET 8 AOT Web API 的发布目录(`publish` 文件夹)内部,需调整项目配置和发布流程。以下是完整解决方案: --- ### **1. 调整项目结构** 将 VitePress 的 `dist` 文件夹**移动到项目根目录**(与 `.csproj` 文件同级): ``` MyAotProject/ ├── dist/ # VitePress 生成的静态文件 │ ├── index.html │ └── assets/ ├── Program.cs └── MyAotProject.csproj ``` --- ### **2. 修改项目文件(`.csproj`)** 配置发布时复制 `dist` 文件夹到 `publish` 内部: ```xml{7-10} <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net8.0</TargetFramework> <PublishAot>true</PublishAot> <InvariantGlobalization>true</InvariantGlobalization> </PropertyGroup> <!-- 确保 dist 文件夹复制到 publish 内部 --> <ItemGroup> <Content Include="dist\**" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> </Project> ``` > 关键配置:`<Content Include="dist\**" CopyToPublishDirectory="PreserveNewest"` 确保 `dist` 内容被复制到 `publish` 文件夹内[^3]。 --- ### **3. 配置静态文件中间件(`Program.cs`)** 使用**相对路径**指向 `publish/dist`: ```csharp{6-7,10-11} var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); // 静态文件服务指向 publish/dist app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(app.Environment.ContentRootPath, "dist")), // 相对路径 RequestPath = "" }); // SPA 路由回退 app.MapFallbackToFile("index.html", new StaticFileOptions { FileProvider = new PhysicalFileProvider( Path.Combine(app.Environment.ContentRootPath, "dist")) // 相对路径 }); app.MapControllers(); app.Run(); ``` > 说明:`app.Environment.ContentRootPath` 在发布后自动指向 `publish` 文件夹,因此 `dist` 路径为 `publish/dist`[^1][^2]。 --- ### **4. 发布应用** 运行以下命令生成包含 `dist` 的 `publish` 文件夹: ```bash dotnet publish -c Release -r win-x64 --self-contained ``` 发布后的目录结构: ``` publish/ ├── dist/ # 静态文件已集成 │ ├── index.html │ └── assets/ ├── MyAotProject.exe ├── web.config └── ... # 其他依赖项 ``` --- ### **5. IIS 部署验证** 1. 将整个 `publish` 文件夹设为 IIS 网站的**物理路径** 2. 访问网站根路径(如 `http://localhost:8080`)应显示 VitePress 页面 3. 检查资源加载: - 正确情况:`http://localhost:8080/assets/main.js` 返回 JS 文件 - 错误情况:404 错误需检查 `dist` 是否在 `publish` 内 --- ### **关键原理** 1. **路径解析** `.NET AOT` 运行时将 `app.Environment.ContentRootPath` 解析为 `publish` 文件夹的绝对路径,因此 `Path.Combine(..., "dist")` 指向 `publish/dist`[^1][^2]。 2. **发布集成** `.csproj` 中的 `<Content Include>` 确保构建时 `dist` 被复制到 `publish` 内部,而非同级目录[^3]。 3. **SPA 兼容性** `MapFallbackToFile` 将所有未匹配路由(如 `/guide/`)回退到 `dist/index.html`,支持 VitePress 前端路由[^1][^2]。 --- ### **常见问题解决** | 问题现象 | 解决方案 | |--------------------------|-----------------------------------| | 静态文件 404 错误 | 检查 `publish/dist` 文件权限 | | 页面加载但资源缺失 | 确认 VitePress 的 `base` 配置为 `/` | | AOT 编译失败 | 检查是否禁用动态反射代码 | | IIS 返回 500.19 错误 | 安装最新的 [.NET 8 Hosting Bundle](https://dotnet.microsoft.com/download/dotnet/8.0) | --- ### **相关问题** 1. 如何为 VitePress 配置资源基础路径(`base`)以避免部署后的路径问题? 2. 在 AOT 编译中如何解决 `System.Reflection` 相关的运行时错误? 3. 如何为 IIS 上的 .NET AOT 应用配置 HTTPS 重定向和 HSTS? 4. 能否在 CI/CD 流程中自动化构建 VitePress 并集成到 .NET 发布过程? [^1]: 静态文件处理通过中间件实现,支持 SPA 路由回退[参考](https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files) [^2]: AOT 编译优化首次加载性能,浏览器直接执行预编译代码[参考](https://angular.cn/guide/aot-compiler) [^3]: 项目文件配置控制发布目录结构[参考 MSBuild 文档](https://learn.microsoft.com/zh-cn/visualstudio/msbuild/common-msbuild-project-items)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值