2011-09-12 140 views
4

當我嘗試使用它構建VS2010解決方案(其中包含網站項目)時,我遇到了MSBuild任務的奇怪行爲。如果我在Visual Studio 2010中打開該解決方案並嘗試對其進行編譯,它就可以工作。但是,如果我嘗試從我的MSBuild腳本編譯它,它會失敗並顯示錯誤。MSBuild網站編譯失敗,但在Visual Studio中工作

我已經跟蹤到這樣的事實,即WebSite目錄中有一個用戶控件,它不使用後面的代碼。

重現步驟:

1)假設你有簡單的解決方案。只是一個網站和兩個用戶控件:

網\控件\ HelpButton.ascx:

<%@ Control Language="C#" ClassName="HelpButton" %> 

<script runat="server"> 
    private string _helpUrl; 
    public string HelpUrl 
    { 
     get { return _helpUrl; } 
     set { _helpUrl = value; } 
    } 

</script> 

網\ AnotherFolder \ TestUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestUserControl.ascx.cs" Inherits="AnotherFolder_TestUserControl" %> 
<%@ Register Src="~/Controls/HelpButton.ascx" TagPrefix="myCtrl" TagName="HelpButton" %> 

<myCtrl:HelpButton runat="server" ID="HelpButton" /> 

網\ AnotherFolder \ TestUserControl。 ascx.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class AnotherFolder_TestUserControl : System.Web.UI.UserControl 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     this.HelpButton.HelpUrl = "trada"; 

     base.OnLoad(e); 
    } 

} 

VS2010可以建立這個網站沒有問題。

2)以下的MSBuild用途:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
DefaultTargets="Build"> 

<PropertyGroup> 
<SolutionProperties>Configuration=Release</SolutionProperties> 
</PropertyGroup> 

<Target Name="Build" DependsOnTargets=""> 

<MSBuild Projects="BuildTest.sln" Targets="Build" Properties="$(SolutionProperties)" RebaseOutputs="true"> 
    </MSBuild> 
    </Target> 
</Project> 

3)運行的MSBuild腳本:

Microsoft (R) Build Engine Version 4.0.30319.1 
[Microsoft .NET Framework, Version 4.0.30319.235] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 9/9/2011 2:21:50 PM. 
Project "d:\Src\MSBuildIssue\build.msbuild" on node 1 (default targets). 
Project "d:\Src\MSBuildIssue\build.msbuild" (1) is building "d:\Src\MSBuildIssue\BuildTest.sln" (2) on node 1 (Build target(s)). 
ValidateSolutionConfiguration: 
    Building solution configuration "Release|Any CPU". 
Project "d:\Src\MSBuildIssue\BuildTest.sln" (2) is building "d:\Src\MSBuildIssue\WebSite.metaproj" (3) on node 1 (default targets). 
Build: 
    C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v /WebSite -p WebSite\ -u -f PrecompiledWeb\WebSite\ 
d:\Src\MSBuildIssue\WebSite\AnotherFolder\TestUserControl.ascx.cs(12): error CS1061: 'System.Web.UI.UserControl' does not contain a definition for 'HelpUrl' and no extension method 'HelpUrl' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) [d:\Src\MSBuildIssue\WebSite.metaproj] 
Done Building Project "d:\Src\MSBuildIssue\WebSite.metaproj" (default targets) -- FAILED. 
Done Building Project "d:\Src\MSBuildIssue\BuildTest.sln" (Build target(s)) -- FAILED. 
Done Building Project "d:\Src\MSBuildIssue\build.msbuild" (default targets) -- FAILED. 

Build FAILED. 

"d:\Src\MSBuildIssue\build.msbuild" (default target) (1) -> 
"d:\Src\MSBuildIssue\BuildTest.sln" (Build target) (2) -> 
"d:\Src\MSBuildIssue\WebSite.metaproj" (default target) (3) -> 
(Build target) -> 
    d:\Src\MSBuildIssue\WebSite\AnotherFolder\TestUserControl.ascx.cs(12): error CS1061: 'System.Web.UI.UserControl' does not contain a definition for 'HelpUrl' and no extension method 'HelpUrl' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) [d:\Src\MSBuildIssue\WebSite.metaproj] 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:02.66 

在我看來:

顯示跟隨誤差的MSBuild build.msbuild就像它按照錯誤的順序編譯用戶控件一樣'HelpButton'放在'TestUserControl'上並且'TestUserControl'爲'HelpButton'對象的屬性賦值。 這是已知的問題嗎?任何建議如何解決這個問題?

一種解決方法不適用於我,它是從MSBuild腳本執行devenv.exe並讓devenv.exe構建解決方案。它編譯成功,但問題是我不能通過這種方式發送額外的MSBuild屬性。

謝謝

編輯:當針對解決方案文件直接執行的MSBuild命令的輸出:

c:\Tmp\MSBuildIssue>msbuild.exe BuildTest.sln /target:Build /p:Configuration="Debug",Platform="Any CPU" 


Microsoft (R) Build Engine Version 4.0.30319.1 
[Microsoft .NET Framework, Version 4.0.30319.235] 
Copyright (C) Microsoft Corporation 2007. All rights reserved. 

Build started 9/12/2011 12:05:38 PM. 
Project "c:\Tmp\MSBuildIssue\BuildTest.sln" on node 1 (Build target(s)). 
ValidateSolutionConfiguration: 
    Building solution configuration "Debug|Any CPU". 
Project "c:\Tmp\MSBuildIssue\BuildTest.sln" (1) is building "c:\Tmp\MSBuildIssue\WebSite.metaproj" (2) on node 1 (default targets). 
Build: 
    C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe -v /WebSite -p WebSite\ -u -f -d PrecompiledWeb\WebSite\ 
c:\Tmp\MSBuildIssue\WebSite\AnotherFolder\TestUserControl.ascx.cs(12): error CS1061: 'System.Web.UI.UserControl' does not contain a definition for 'HelpUrl' and no extension method 'HelpUrl' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) [c:\Tmp\MSBuildIssue\WebSite.metaproj] 
Done Building Project "c:\Tmp\MSBuildIssue\WebSite.metaproj" (default targets) -- FAILED. 
Done Building Project "c:\Tmp\MSBuildIssue\BuildTest.sln" (Build target(s)) -- FAILED. 

Build FAILED. 

"c:\Tmp\MSBuildIssue\BuildTest.sln" (Build target) (1) -> 
"c:\Tmp\MSBuildIssue\WebSite.metaproj" (default target) (2) -> 
(Build target) -> 
    c:\Tmp\MSBuildIssue\WebSite\AnotherFolder\TestUserControl.ascx.cs(12): error CS1061: 'System.Web.UI.UserControl' does not contain a definition for 'HelpUrl' and no extension method 'HelpUrl' accepting a first argument of type 'System.Web.UI.UserControl' could be found (are you missing a using directive or an assembly reference?) [c:\Tmp\MSBuildIssue\WebSite.metaproj] 

    0 Warning(s) 
    1 Error(s) 

Time Elapsed 00:00:01.77 
+0

的輸出是什麼,如果你試圖直接在命令行執行的MSBuild:'msbuild.exe BuildTest.sln /目標:構建/ P:配置=「調試」,平臺=「AnyCPU」 '? – Andreas

+0

我已將命令輸出添加到原始文章。這是一樣的錯誤。 –

回答

0

那這行<%@ Register Src="~/Controls/HelpButton.ascx" ...?您的按鈕似乎位於不同的目錄中。

+0

對不起,我的原始文章中有錯字 - HelpButton控件實際上位於web \ Controls \ HelpButton.ascx中。對不起,我已編輯我的問題來解決這個問題。 –

+0

嗯好的抱歉,我無法幫助你。在最糟糕的情況下,您必須更改控件以使用代碼隱藏文件並將該屬性放置在那裏。 – Andreas

1

最後我最終使用AspNetCompiler而不是MSBuild。令人驚訝的是AspNetCompiler在MSBuild任務失敗的情況下工作。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="PrecompileWeb"> 
     <AspNetCompiler 
      VirtualPath="/MyWebSite" 
      PhysicalPath="c:\inetpub\wwwroot\MyWebSite\" 
      TargetPath="c:\precompiledweb\MyWebSite\" 
      Force="true" 
      Debug="true" 
     /> 
    </Target> 

我與我們的實際生產解決方案來解決的唯一的問題是,我們的解決方案包含許多其他項目(組件,可執行文件),而不僅僅是網站。出於這個原因,我不得不將解決方案的構建分成兩步 - 首先只編譯程序集(使用MSBuild任務),第二步調用AspNetCompiler編譯網站。

感謝您的幫助

+0

它的工作原理。謝謝。 – Birey

相關問題