2013-02-19 95 views
0

我正在使用Microsoft的AjaxMin來縮小我的網站上的JavaScript,該網站由Azure託管。我正在使用BuildTask在運行時自動縮小JavaScript。該構建任務在.csproj文件中指定。AjaxMin不能在Azure站點上工作

該進程正在處理我的本地環境,但是,當我部署到Azure站點時它不起作用。天藍色的網站拋出404:文件未找到錯誤,當我嘗試引用.js文件的縮小版本。

是否可以在Azure站點上使用構建任務?有什麼我失蹤?我確定不要在源代碼管理中包含.min.js文件,因爲這(http://www.asp.net/ajaxlibrary/AjaxMinQuickStart.ashx)教程建議,但我想知道是否有任何特定於Azure的東西需要設置。

謝謝!

回答

1

我已經在我的項目中正常工作。我會告訴你我是怎麼做到的,儘管這可能不是最簡單或最直接的方法。

在我們開始之前,能夠檢查您的縮小文件是否包含在Azure部署軟件包中而不實際部署是有幫助的。這很容易做到。 .cspkg文件實際上是一個zip格式的文件,因此您可以使用任何zip壓縮文件打開它。 (我喜歡爲此使用7Zip,因爲右鍵單擊 - > Open Archive命令不需要您重命名文件,但可以使用Windows資源管理器,WinRAR等)。在.cspkg內部,您會看到另一個大文件擴展名爲.cssx。這也是一個zip文件。在.cssx的內部,您會發現一個sitesroot文件夾,其中包含您正在部署的每個網站的子目錄,其中將包含您的所有實際網站文件。因此,您可以在那裏查看哪些文件正在部署到Azure。

首先,嘗試編輯您的web項目(包含所有Javascript/CSS文件的項目文件)的項目文件。您可以使用記事本,或在Visual Studio中右鍵單擊該項目,選擇「卸載項目」,然後再次右鍵單擊並選擇「編輯」。裏面的項目文件中插入這樣的節:

<ItemGroup> 
    <!-- Copy over all the minified CSS & JS to the output directory--> 
    <Content Include="**\*.min.css" /> 
    <Content Include="**\*.min.js" /> 
</ItemGroup> 

然後重新加載項目,重新包裝,看看你的文件都包含在.cspkg文件。如果他們是,那麼你就完成了。

如果沒有,還有其他一些事情要檢查。您的縮小可能無法在正確的構建階段運行。我的微小目標看起來是這樣的:

<Target Name="PrepWebApp" Condition="$(Configuration)=='Release'" AfterTargets="AfterBuild"> 

如果仍然沒有工作,你的Web角色有多個站點和/或它的虛擬應用程序,它可能是在包裝的步驟沒有運行的所有網站。因此,當您將項目打包爲部署到Azure時,它可能仍未運行縮小步驟(以及web.config轉換和其他一些操作)。如果是這種情況,請參閱this blog post以解決問題。

萬一那個博客中消失了,我會在這裏複製最相關的位。你會把這在.ccproj文件爲您的Web角色(在適當的位改變,以匹配您的項目結構):

<PropertyGroup> 
    <!-- Inject the publication of "secondary" sites into the Windows Azure build/project packaging process. --> 
    <CoreBuildDependsOn> 
    CleanSecondarySites; 
    PublishSecondarySites; 
    $(CoreBuildDependsOn) 
    </CoreBuildDependsOn> 
    <!-- This is the directory within the web application project directory to which the project will be "published" for later packaging by the Azure project. --> 
    <SecondarySitePublishDir>azure.publish\</SecondarySitePublishDir> 
</PropertyGroup> 
<!-- These SecondarySite items represent the collection of sites (other than the web application associated with the role) that need special packaging. --> 
<ItemGroup> 
    <SecondarySite Include="..\WebApplication1\WebApplication1.csproj" /> 
    <SecondarySite Include="..\WebApplication2\WebApplication2.csproj" /> 
</ItemGroup> 
<Target Name="CleanSecondarySites"> 
    <RemoveDir Directories="%(SecondarySite.RootDir)%(Directory)$(SecondarySitePublishDir)" /> 
</Target> 
<Target Name="PublishSecondarySites" Condition="'$(PackageForComputeEmulator)' == 'true' 
         Or '$(IsExecutingPublishTarget)' == 'true' "> 
    <!-- 
    Execute the Build (and more importantly the _WPPCopyWebApplication) target to "publish" each secondary web application project. 

    Note the setting of the WebProjectOutputDir property; this is where the project will be published to be later picked up by CSPack. 
    --> 
    <MSBuild Projects="%(SecondarySite.Identity)" Targets="Build;_WPPCopyWebApplication" Properties="Configuration=$(Configuration);Platform=$(Platform);WebProjectOutputDir=$(SecondarySitePublishDir)" /> 
0

當您構建項目時,構建任務將在Visual Studio中運行。您需要確保縮小的文件也正在部署到Azure。

我猜測,也許是因爲該項目是在構建時生成的,它不是項目本身的一部分,並且部署步驟會忽略它。

請檢查正在使用的部署系統是否包含所有腳本文件,而不僅僅是項目本身中的腳本文件。

+0

感謝您的答覆。我不確定我想要在項目中包含.min.js文件。據微軟稱:「如果你在項目中包含縮小的文件,並使用源代碼控制,那麼你會遇到問題,當文件簽出源代碼控制的,他們用自己的只讀屬性設置如果選中了你嘗試做一個構建,微軟的Ajax Minifier會產生一個錯誤,當它試圖寫入只讀文件。」似乎Azure應該在每次構建之後創建文件,而不是從本地環境中檢入文件 – user1521567 2013-02-20 15:08:51

相關問題