Mapster生成目录配置:让映射器类与接口同目录生成
让Mapster生成的映射器类和接口待在同一个目录的解决办法
问题说明
项目按实体划分独立文件夹存储mapper接口,但Mapster生成的映射器类默认跑到上级目录,需要实现:不管文件夹名称是什么,生成的映射器类都和对应接口处于同一目录。
当前配置(已尝试调整但无效)
<ItemGroup> <Generated Include="**/*.g.cs" /> <!--清理生成文件命令:dotnet msbuild -t:CleanGenerated--> </ItemGroup> <Target Name="CleanGenerated" BeforeTargets="build"> <Delete Files="@(Generated)" /> </Target> <Target Name="Mapster" AfterTargets="AfterBuild"> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet tool restore" /> <!--<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster model -a \"$(TargetDir)$(ProjectName).dll\"" /> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster extension -a \"$(TargetDir)$(ProjectName).dll\"" />--> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster mapper -a \"$(TargetDir)$(ProjectName).dll\"" /> </Target>
已尝试的操作:
- 调整
<Generated Include>属性值 - 使用Mapster.Tool的
-n、-b、-o选项,均未解决问题
解决方案
Mapster.Tool默认不会自动匹配接口的子目录结构,需结合配置文件和MSBuild逻辑实现需求,步骤如下:
1. 创建Mapster配置文件
在项目根目录新建mapster.json文件,配置生成规则让输出路径匹配接口所在目录:
{ "Mapper": { "GenerateMethods": "All", "Namespace": "{Namespace}", "OutputPath": "{Directory}" } }
其中{Directory}会自动替换为接口所在的目录路径,确保生成的映射器类直接输出到接口所在文件夹。
2. 修改MSBuild Target配置
更新项目的MSBuild目标,添加配置文件引用,确保生成逻辑读取我们定义的规则:
<ItemGroup> <Generated Include="**/*.g.cs" /> </ItemGroup> <Target Name="CleanGenerated" BeforeTargets="Build"> <Delete Files="@(Generated)" /> </Target> <Target Name="MapsterGenerate" AfterTargets="AfterBuild"> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet tool restore" /> <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster mapper -a "$(TargetDir)$(ProjectName).dll" -c mapster.json" /> </Target>
关键是新增-c mapster.json参数,指定使用我们创建的配置文件。
3. 验证生成结果
清理项目后重新构建,Mapster会将映射器类直接生成到对应接口所在的目录中。
若仍未生效,检查以下几点:
- 接口的命名空间需与目录结构一致(Mapster通过命名空间推导目录路径)
- 确认
mapster.json放置在项目根目录,路径无错误 - 先执行清理命令再构建,避免旧生成文件缓存干扰
内容的提问来源于stack exchange,提问作者Дед
相关产品推荐
相关产品推荐

