我认为,当msbuild即将编译源代码文件,它产生的文件来构建,基于名单Include和Exclude项目的规则.
有没有办法在评估要编译的文件列表之前执行任务?
这是为了能够生成源代码文件并使其在构建中获取.
我正在制作一个.NET Core CLI工具,必须在使用它的项目构建之前运行,因为它(CLI工具)生成一个必须包含在构建中的文件.
该项目是使用新.csproj系统创建的,而不是旧系统project.json.
与我的.NET Core CLI工具项目一起,我创建了一个用于测试目的的库项目.
如果我.csproj在测试库中添加它:
<ItemGroup>
<DotNetCliToolReference Include="MyCliTool" Version="x.x.x" />
<!-- here x.x.x is just a placeholder -->
</ItemGroup>
<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild">
<Exec Command="dotnet my-cli-tool" />
</Target>
Run Code Online (Sandbox Code Playgroud)
然后,如果之前不存在,则不会在编译中考虑CLI工具生成的文件.这意味着当文件存在时,它可以,但这也意味着第一次构建(克隆,清理或什么之后)总是会失败.
我尝试了几个不同的目标,BeforeTargets但我找不到让它工作的方法.我试图InitialTargets在Project节点中设置我的目标,但它也不起作用.我试图Outputs将Target节点的属性设置为CLI工具生成的文件名,但同样,它失败了.
我发现唯一有效的解决方案是手动添加Compile指令,如下所示:
<ItemGroup>
<Compile Include="MyGeneratedFile.cs" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
此解决方案暂时没问题,但文件名可能会根据CLI工具选项而改变,这会使两个地方的文件名必须在更改时更新,如下所示:
<ItemGroup>
<Compile Include="PATH\TO\CUSTOM_FILENAME_HERE.CS" />
<DotNetCliToolReference Include="MyCliTool" Version="x.x.x" />
</ItemGroup>
<Target Name="MyCliToolTarget" …Run Code Online (Sandbox Code Playgroud)