過去,我爲C++項目做了許多MSBuild定製工作。 輸入和輸出 MSBuild目標的屬性用於確定目標是否必須執行。此外,Visual Studio使用.tlog文件(位於中間目錄中)來確定是否必須調用MSBuild。Visual Studio如何確定它是否必須啓動MSBuild?
現在我正在開發一個C#項目。我寫了一個簡單的MSBuild目標,其將文件複製到輸出目錄:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CopyMyFile" BeforeTargets="AfterBuild" Inputs="$(ProjectDir)File.dat" Outputs="$(TargetDir)FileRenamed.dat">
<Copy SourceFiles="$(ProjectDir)File.dat" DestinationFiles="$(TargetDir)FileRenamed.dat" OverwriteReadOnlyFiles="true">
</Copy>
</Target>
</Project>
目標工作,如果構建是通過調用MSBuild.exe預期。如果目標文件不存在或源文件已被修改,則會複製該文件。
如果我調用Visual Studio中的構建,它不會按預期工作。如果我從輸出目錄中刪除文件,Visual Studio不會調用MSBuild。另一方面,即使沒有其他更改,修改源文件後每次構建項目時都會調用MSBuild。
看來,Visual Studio只是將項目中的每個文件與輸出文件(.exe,.dll或.pdb)進行比較。如果項目中的任何文件比輸出文件更新,則調用MSBuild。在我的情況下,MSBuild不更新.exe文件,所以MSBuild被一次又一次地調用。
在C++項目中,此行爲由.tlog文件控制。在C#項目中有類似的東西嗎?
非常感謝!
.tlog文件不是由MSBuild直接使用,而是由Visual Studio決定是否需要調用MSBuild。我曾經爲自定義構建目標創建自己的.tlog文件,以控制何時Visual Studio必須調用MSBuild,何時不調用MSBuild。我希望有類似的技術可用於C#項目。 – alerosmile
你確定嗎?即使不使用VS構建C++項目,但僅創建了msbuild tlog文件(並且可能在下一版本中再次讀入) – stijn
您是對的。對不起,評論錯誤。但是,Visual Studio使用.tlog文件來決定是否需要調用MSBuild的假設仍然有希望。但無論如何,這並不重要。我需要的是一種告訴Visual Studio什麼時候調用MSBuild的方法,什麼時候不需要,因爲Visual Studio不知道我的自定義構建目標。 – alerosmile