在 dotnet core csproj 文件中使用 Pre 和 Post 构建操作

Sam*_*ara 5 msbuild .net-core

我是 .NET Core 新手,我正在尝试在我的 csproj 文件中设置预构建操作。根据 [1],我们可以使用 Target 元素来指定预构建步骤,如下所示:

<Target Name="MyPreCompileTarget" BeforeTargets="Build">
        <Exec Command="generateCode.cmd"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

但是,这个元素似乎没有被 MSBuild 工具选中。我的完整 csproj 文件如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

    <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <Folder Include="wwwroot\"/>
    </ItemGroup>
    

    <Target Name="MyPreCompileTarget" BeforeTargets="Build">
        <Exec Command="echo meow meow"/>
    </Target>

    <ItemGroup>
        <PackageReference Include="FluentValidation.AspNetCore" Version="7.0.0"/>
        <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.3"/>
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="1.0.3"/>
        <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.2"/>
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\my-lib\<my-lib>.csproj"/>
    </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

参考

[1] - https://docs.microsoft.com/en-us/dotnet/articles/core/tools/project-json-to-csproj#the-csproj-format

Mar*_*ich 4

echo在这种情况下,它是命令 shell ( cmd.exe) 的内置命令,因此它不起作用。

如果您只使用 eg generateCode,msbuild 还将根据您运行的平台查找.bat与该名称匹配的文件。.sh

您可以运行该dotnet build命令来/v:diag获取完整的诊断输出。

您还可以通过在目标中添加如下任务来验证您的目标是否实际运行:

<Message Importance="high" Text="Test Message" />
Run Code Online (Sandbox Code Playgroud)

另外,由于echo在 Mac 上可用,因此当我在 Mac 上运行您的项目文件时,它会达到预期的效果:

MacBook-Pro:footest martin$ dotnet build
Microsoft (R) Build Engine version 15.3.234.47922 for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  footest -> /Users/martin/tmp/footest/bin/Debug/netcoreapp1.1/footest.dll
  meow meow

Build succeeded.
    0 Warning(s)
    0 Error(s)
Run Code Online (Sandbox Code Playgroud)