docs/articles/tools/mapster-tool/Mapster-Tool-Overview.md
The Mapster.Tool is a command-line tool that helps you generate DTOs (Data Transfer Objects) and mapping code based on your domain models or interfaces. It supports various generation strategies, including Fluent API configuration, attribute-based annotations, and interface-based definitions.
#skip this step if you already have dotnet-tools.json
dotnet new tool-manifest
dotnet tool install Mapster.Tool
For lightweight dependency, you can just install Mapster.Core.
PM> Install-Package Mapster.Core
However, if you need TypeAdapterConfig for advance configuration, you still need Mapster.
PM> Install-Package Mapster
Mapster.Tool provides 3 commands:
And Mapster.Tool provides following options
-a: Define input assembly-b: Specify base namespace for generating dynamic outputs & namespaces-n: Define namespace of generated classes-o: Define output directory-p: Print full type name (if your DTOs/POCOs having the same name)-r: Generate record types instead of POCO typesadd following code to your csproj file:
<Target Name="Mapster">
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet build" />
<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>
to generate run following command on csproj file directory:
dotnet msbuild -t:Mapster
add following code to your csproj file:
<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>
add following code to your csproj file:
<ItemGroup>
<Generated Include="**\*.g.cs" />
</ItemGroup>
<Target Name="CleanGenerated">
<Delete Files="@(Generated)" />
</Target>
to clean up run following command:
dotnet msbuild -t:CleanGenerated
If your POCOs and DTOs have the same name, you might need to generate using full type name, by adding -p flag:
<Target Name="Mapster">
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet build" />
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet tool restore" />
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster model -a "$(TargetDir)$(ProjectName).dll" -p" />
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster extension -a "$(TargetDir)$(ProjectName).dll" -p" />
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet mapster mapper -a "$(TargetDir)$(ProjectName).dll" -p" />
</Target>
For example you have following structure.
Sample.CodeGen
- Domains
- Sub1
- Domain1
- Sub2
- Domain2
And if you can specify base namespace as Sample.CodeGen.Domains:
<Exec WorkingDirectory="$(ProjectDir)"
Command="dotnet mapster model -a "$(TargetDir)$(ProjectName).dll" -n Sample.CodeGen.Generated -b Sample.CodeGen.Domains" />
Code will be generated to:
Sample.CodeGen
- Generated
- Sub1
- Dto1
- Sub2
- Dto2
There are 3 flavors, to generate DTOs and mapping codes:
If you get an error similar to Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly '...'. The system cannot find the file specified. and you are using Mapster.Tool 8.4.1 or newer, then you can try one of the following workarounds:
Workaround 1
Ensure that you are using Mapster.Tool version 8.4.2-pre01 or newer. The latest pre-release version is:
Workaround 2
Add <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> to your csproj file as follows:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
[...]
Workaround 3
Change your dotnet build command to dotnet build -p:CopyLocalLockFileAssemblies=true as follows:
<Project>
[...]
<Target Name="Mapster">
<Exec WorkingDirectory="$(ProjectDir)" Command="dotnet build -p:CopyLocalLockFileAssemblies=true" />
[...]
</Target>
[...]
</Project>