Home

Awesome

Cli4Fody

中文 | English

Cli4Fody是一个命令行工具,用于管理Fody插件和修改FodyWeavers.xml文件。通过该工具,可以让部分Fody插件实现完全零侵入式的MSIL修改。

快速开始

安装Cli4Fody

dotnet tool install -g Cli4Fody

假设当前解决方案MySolution.sln下有如下FodyWeavers.xml

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <ConfigureAwait />
</Weavers>

执行如下命令:

fody-cli MySolution.sln --addin ConfigureAwait -a ContinueOnCapturedContext=false --addin Rougamo

执行命令后的FodyWeavers.xml

<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <ConfigureAwait ContinueOnCapturedContext="false" />
  <Rougamo />
</Weavers>

命令格式

fody-cli <SolutionOrProjectPath> [Options]

使用场景

Cli4Fody主要有两个应用场景:

  1. 你平时在使用Fody插件的时候可能已经发现,自己的项目必须直接依赖Fody插件,间接依赖时Fody插件不生效,比如[项目A] -> [项目B] -> Rougamo.Fody,此时项目A中是可以使用Rougamo.Fody中定义的类型的,但在编译时并没有修改对应的MSIL,必须项目A直接依赖Rougamo.Fody才会生效。出现这种情况是因为Fody调用系列插件修改MSIL是通过在MSBuild管道中插入一个在编译后执行的任务实现的,Fody的NuGet包中的build目录下包含了添加MSBuild任务的配置。而在项目依赖中,默认是不会传递这些配置的,所以需要每个项目都直接依赖Fody插件。

    由于间接依赖时已经能够使用到Fody插件中的类型,所以我们很容易忘记直接依赖Fody插件,导致最终插件未生效,此时便可以通过Cli4Fody为解决方案中的每个项目添加直接依赖。下面的命令会为解决方案的每个项目添加Rougamo.Fody的直接依赖,并新增/修改FodyWeavers.xml文件。

    fody-cli MySolution.sln --addin Rougamo -pv 4.0.4

  2. 部分Fody插件是可以仅通过配置来完成其目标的,比如ConfigureAwait.Fody、Pooling.Fody等。对于这类插件,可以通过Cli4Fody直接完成配置。

    fody-cli MySolution.sln \
              --addin ConfigureAwait -pv 3.3.2 -a ContinueOnCapturedContext=false \
              --addin Pooling -pv 0.1.0 \
                  -n Inspects:Inspect -v "execution(* *..*Serivce.*(..))" \
                  -n Items:Item -a stateless=Random
    

推荐实践

Cli4Fody非常适配CI,可以在自动构建中统一配置,既可以轻松的完成对Fody插件直接依赖的查漏补缺,也可以轻松地配置无侵入式Fody插件。比如可以参考DockerSample项目,在Dockerfile中通过Cli4Fody确保Rougamo.Fody的直接依赖以及添加对ConfigureAwait的依赖并进行配置。

FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base
USER app
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src

COPY ["ConsoleApp/ConsoleApp.csproj", "ConsoleApp/"]
RUN dotnet restore "./ConsoleApp/ConsoleApp.csproj"

COPY . .

ENV PATH="$PATH:/root/.dotnet/tools"
RUN dotnet tool install -g Cli4Fody
RUN fody-cli DockerSample.sln --addin Rougamo -pv 4.0.4 --addin ConfigureAwait -pv 3.3.2  -a ContinueOnCapturedContext=false

RUN dotnet restore "./ConsoleApp/ConsoleApp.csproj"

RUN dotnet publish "./ConsoleApp/ConsoleApp.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "ConsoleApp.dll"]

Pooling零侵入实践

Pooling 使用 Cli4Fody 实现零侵入式对象池操作替换