我已經開始直接使用MSBuild API來擴展構建過程並增加靈活性。爲VC++使用MSBuild API時活動的用戶名差異?
我已成功實現了構建項目的整個過程,但並非沒有幾個「陷阱」。由於MSBuild API的文檔和使用示例極度缺乏,我不得不忍受一些冗長的調試會話。
希望我在這裏列出的細節能夠幫助其他人直接與MSBuild API集成。編譯C#代碼非常容易,但是一旦我嘗試使用MSBuild API來編譯我們的一些傳統VC++項目,這個過程真的遇到了一個障礙。
這是我的編譯器包裝的一個代碼示例:
globalProperties["Configuration"] = CommonLibrary.BuildMode.Release.ToString();
//add the compiler variables from the specific project to the properties dictionary
if (compilerVariables != null)
{
foreach(var kvp in compilerVariables)
{
globalProperties.Add(kvp.Key, kvp.Value);
}
}
//set up a build request to be sent to MSBuild
var request = new BuildRequestData(project.SolutionFile.FullName, globalProperties, null, new string[] { "Rebuild" }, null);
//configure settings for MSBuild specifically
var buildParams = new BuildParameters();
buildParams.EnableNodeReuse = true;
buildParams.Loggers = new List<Microsoft.Build.Framework.ILogger>()
{
buildLogger,
fileLogger
};
//instantiate the BuildManager, kick off the build, and get the results
BuildManager buildManager = new BuildManager();
project.BuildResult = buildManager.Build(buildParams, request);
該方法的另一個方面涉及.props文件VC++使用,以獲得在INCLUDE所需接頭(和其他路徑)。這個.props文件位於C:\ Users \%BUILDACCOUNT%\ AppData \ Local \ Microsoft \ MSBuild \ v4.0 \ Microsoft.Cpp。%TargetPlatform%.user.props
現在出現一個有趣的部分。
當我對C#項目/解決方案運行此代碼時,一切正常。這是因爲.props文件不參與C#編譯(包含路徑以.csproj級別存儲)。
但是,當針對包含VC++項目的解決方案運行時,此方法完全落在它的表面上。原因是因爲它無法解析可能位於道具文件(在上面詳述的位置)內的INCLUDE路徑。
另一個有趣的tid位是我可以直接從命令行復制參數到MSBuild,並且構建成功。這讓我很困惑......所以我打開了詳細的診斷程序並再次運行我的測試用例。
從日誌有趣的信息(日誌已被修剪):
- 從命令行建築
USERDOMAIN = [刪除]
USERNAME = MyUserName輸入
LOCALAPPDATA = C:\ Users \ MyUserName \ AppData \ Local
- 從API大廈
USERDOMAIN = [絕密]
USERNAME = BUILDMACHINE $
LOCALAPPDATA = C:\ WINDOWS \ system32 \設置\ systemprofile \應用程序數據\本地
正如您所看到的,似乎從CLI構建時的當前身份正確設置爲我的身份。但是,使用API進行構建可將當前身份設置爲本地系統。這導致INCLUDE路徑未正確設置爲API構建,因爲具有該信息的props文件在預期位置(C:\ Windows \ system32 \ config \ systemprofile \ AppData \ Local)不可用。
我的解決方法似乎到目前爲止工作是實際將所有道具文件從AppData位置移動到API所期望的目錄中。我不認爲這是預期的行爲...它似乎不是很清楚。
其他注意事項:
- 這段代碼被託管在IIS,運行爲「MyUserName輸入」(而不是本地系統)的應用程序池中。
- 我已經能夠重現上兩臺不同的機器都運行Windows Server 2008
這個問題無論是我錯誤地做一些事情,或MSBuild的API被錯誤地做什麼?任何有關獲取MSBuild API所識別的道具文件的官方手段的輸入都會非常有用。
謝謝。