NuGet Gallery | Jgrass.MSBuild.GitTask
前言
在 .NET 项目自定义 MSBuild Task 中提到,可以使用自定义 MSBuild Task 来实现自定义功能。
这里介绍实现的 git 提交大文件提交拦截功能。
引入 nuget 包之后,设置好要拦截的大小,内置的 LargeFileInterceptTask
会自动在当前仓库写入一个 git pre-commit hook,实现拦截功能。
具体原理见:git 禁止大文件提交到仓库中
代码实现
JasonGrass/Jgrass.MSBuild.GitTask: custom git task of msbuild
基本实现方法,在 .NET 项目自定义 MSBuild Task 已经说明。
因为进行了第三方引用,在打包时,需要将第三方引用加入到 nuget 包中,最终的 csproj
是这样的。
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
将依赖项复制到输出目录
<None Include="$(OutputPath)\*.dll" Pack="true" PackagePath="tasks\$(TargetFramework)\"/>
将输出目录中的依赖项,复制到 package 中
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable><LangVersion>latest</LangVersion><OutputType>Library</OutputType><DevelopmentDependency>true</DevelopmentDependency><Version>1.0.0-beta</Version><GeneratePackageOnBuild>true</GeneratePackageOnBuild><BuildOutputTargetFolder>tasks</BuildOutputTargetFolder><NoPackageAnalysis>true</NoPackageAnalysis><CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies><PackageReadmeFile>README.md</PackageReadmeFile><PackageLicenseExpression>MIT</PackageLicenseExpression><RepositoryUrl>https://github.com/JasonGrass/Jgrass.MSBuild.GitTask</RepositoryUrl></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.Build.Framework" Version="17.12.6" /><PackageReference Include="Microsoft.Build.Utilities.Core" Version="17.12.6" /><PackageReference Update="@(PackageReference)" PrivateAssets="All" /></ItemGroup><ItemGroup><PackageReference Include="CliWrap" Version="3.6.7" /></ItemGroup><ItemGroup><Folder Include="Assets\tasks\" /></ItemGroup><ItemGroup><None Include="Assets\build\**" Pack="True" PackagePath="build\" /><None Include="Assets\scripts\**" Pack="True" PackagePath="scripts\" /><None Include="..\README.md" Pack="True" PackagePath="" /><None Include="$(OutputPath)\*.dll" Pack="true" PackagePath="tasks\$(TargetFramework)\"/></ItemGroup></Project>
其它没有什么特别的,直接看源码即可。
参考资料
项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
MSBuild 保留属性和已知属性 - MSBuild | Microsoft Learn
常用的 MSBuild 项目属性 - MSBuild | Microsoft Learn
C# 在不同环境下调用 shell 脚本 | L's Blog
Tyrrrz/CliWrap: Library for running command-line processes
https://www.cnblogs.com/jasongrass/p/18587300