在构建任务之前是否预先安装了.NET Core CLI?

Seb*_*ERT 12 .net msbuild task dotnet-cli visual-studio-2017

这个问题

我认为,当msbuild即将编译源代码文件,它产生的文件来构建,基于名单IncludeExclude项目的规则.

有没有办法在评估要编译的文件列表之前执行任务?

这是为了能够生成源代码文件并使其在构建中获取.

目前的研究和试验

我正在制作一个.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但我找不到让它工作的方法.我试图InitialTargetsProject节点中设置我的目标,但它也不起作用.我试图OutputsTarget节点的属性设置为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" AfterTargets="Restore" BeforeTargets="BeforeBuild">
    <Exec Command="dotnet my-cli-tool --output PATH\TO\CUSTOM_FILENAME_HERE.CS" />
</Target>
Run Code Online (Sandbox Code Playgroud)

(见CUSTOM_FILENAME_HERE.CS出现两次)

我知道我可以使用常量,如下所示:

<PropertyGroup>
    <MyFilename>PATH\TO\CUSTOM_FILENAME_HERE.CS</MyFilename>
</PropertyGroup>

<ItemGroup>
    <Compile Condition="!Exists('$(MyFilename)')" Include="$(MyFilename)" />
    <DotNetCliToolReference Include="MyCliTool" Version="x.x.x" />
</ItemGroup>

<Target Name="MyCliToolTarget" AfterTargets="Restore" BeforeTargets="BeforeBuild">
    <Exec Command="dotnet my-cli-tool --output $(MyFilename)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

但是我对这种方法不满意,它让lambda用户集成太复杂,假设这仍然是一个简化版本,因为CLI工具可以采取其他几个选项,这意味着有其他变量,bla bla bla .

我正在使用.NET Core SDK 1.0.1.

很抱歉这个冗长的问题和我对msbuild的无聊.

在此先感谢您的时间和帮助.




附注:调用dotnet my-cli-tool预构建事件,如:

<PropertyGroup>
    <PreBuildEvent>dotnet my-cli-tool</PreBuildEvent>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

根本不起作用,我收到以下错误:

代码:MSB3073描述:命令"dotnet my-cli-tool"退出代码1.项目:测试库项目,而不是工具一个 文件:C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets行:4935

虽然,以下工作正常:

<PropertyGroup>
    <PreBuildEvent>echo meh</PreBuildEvent>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

所以这不是预构建事件的错误.

无论如何,这是另一个我现在不太关心的故事.

Mar*_*ich 20

.NET SDK调用它的"默认项"是项目文件静态评估的一部分 - 在运行任何目标之前.因此,您需要在@(Compile)需要项目之前运行的目标.

诀窍是在自定义工具运行后包含添加到文件系统的文件.这可以通过重新扫描所有文件并在构建之前运行的目标中排除那些已经属于项目的部分来完成:

  <Target Name="GenerateSomeFiles" BeforeTargets="BeforeBuild">
    <Exec Command="dotnet my-tool" />
    <ItemGroup>
      <Compile Include="**/*$(DefaultLanguageSourceExtension)"
               Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(BaseIntermediateOutputPath)**;$(BaseOutputPath)**;@(Compile)" />
    </ItemGroup>
  </Target>
Run Code Online (Sandbox Code Playgroud)