Dot-Net

在建構任務之前是否有 .NET Core CLI pre?

  • June 29, 2017

問題

我假設當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>

如果 CLI 工俱生成的文件以前不存在,則編譯時不會考慮該文件。這意味著當文件存在時,它是可以的,但這也意味著第一次建構(在複製、清理或其他之後)總是會失敗。

我嘗試了幾個不同的目標,BeforeTargets但我找不到讓它工作的方法。我試圖在InitialTargets節點中設置我的目標Project,但它也不起作用。我嘗試將節點的Outputs屬性設置Target為 CLI 工俱生成的文件名,但同樣,它失敗了。

我發現唯一可行的解​​決方案是手動添加Compile指令,如下所示:

<ItemGroup>
   <Compile Include="MyGeneratedFile.cs" />
</ItemGroup>

這個解決方案目前很好,但是文件名可能會根據 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>

(見 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>

但我對這種方法不滿意,假設這仍然是一個簡化版本,它使 lambda 使用者無法集成,因為 CLI 工具可以採用其他幾個選項,這意味著有其他變數,bla bla bla .

我正在使用 .NET Core SDK 1.0.1。

很抱歉這個冗長的問題和我對 msbuild 的菜鳥。

提前感謝您的時間和幫助。


**旁注:**呼叫dotnet my-cli-tool預建構事件,如:

<PropertyGroup>
   <PreBuildEvent>dotnet my-cli-tool</PreBuildEvent>
</PropertyGroup>

根本不起作用,我收到以下錯誤:

程式碼: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>

所以這不是預建構事件的錯誤。

無論如何,這是另一個我暫時不太關心的故事。

.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>

引用自:https://stackoverflow.com/questions/44818730