我正在創建一個自定義的MSBuild腳本,該腳本旨在將Import
編輯到多個C#項目中。該腳本根據Platform
屬性添加了要複製的多個屬性,引用和文件,以使最終輸出能夠利用一組本機二進制文件。換句話說,它會根據平臺選擇正確的本機二進制文件和相關數據。爲不支持的平臺引發錯誤
目前,我正在做這樣的事情:
<PropertyGroup Condition="'$(Platform)' == 'x86'">
<bin1>..\..\lib\mybinaries\x86\bin1.dll</bin1>
<bin2>..\..\lib\mybinaries\x86\bin2.dll</bin2>
</PropertyGroup>
<PropertyGroup Condition="'$(Platform)' == 'x64'">
<bin1>..\..\lib\mybinaries\x64\bin1.dll</bin1>
<bin2>..\..\lib\mybinaries\x64\bin2.dll</bin2>
</PropertyGroup>
<ItemGroup>
<Reference Include="bin2.dll">
<SpecificVersion>False</SpecificVersion>
<HintPath>$(bin2)</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<None Include="$(bin1)">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
當一個項目內建有UNSUPPORT平臺(如任何CPU),我想構建引發錯誤。我怎樣才能做到這一點?
我調查了一下,看看是否有辦法在構建目標之外引發錯誤,但我無法找到它。即使我確實找到了一個,我也會擔心如果開發者以某種方式讓他們的系統選擇了不受支持的平臺,會發生什麼。 (例如Visual Studio可能會開始拒絕打開該項目。)
我可以覆蓋BeforeBuild
目標,但如果導入此文件的C#項目會覆蓋該目標本身,則會崩潰。 (或者我的會覆蓋他們的,這取決於Import
和<Target Name="BeforeBuild">
的順序。)在這種情況下,不會引發錯誤。這使得它非常脆弱,而且不夠健壯。
我該如何做到這一點,使用戶不可能打破它?還是有一個完全不同的替代方法,我可以考慮包括有條件的二進制文件?
也許你正在尋找類似'<目標名稱= 「MyPlatformCheck」 BeforeTargets = 「生成」/>'?這將在構建之前運行,並使用內置的msbuild功能和自定義名稱,因此很難覆蓋。可能有更好的目標可以使用,例如'PrepareBuild'左右,但我不知道從頭頂上的那些人。 – stijn
@stijn我沒有意識到有可能讓Build取決於自定義任務。如果你能把它變成答案,我會接受它。 – jpmc26