2011-07-15 103 views
1

在我們的一個Web應用程序中,需要在我們爲用戶創建的GUI界面中編輯一些HTML頁面。不幸的是,接口直接從服務器上的頁面讀取/寫入(也在wwwroot中)。服務器上的另一頁從中讀取並僅顯示它。TFS構建工作流將文件夾/文件屬性從只讀更改爲讀取/寫入?

我現在所做的是改變了我們的整個構建過程,所以什麼都不是手工了,我現在使用TFS/VS 2010的構建工作流程,這很好。

但是,當部署代碼時,TFS會自動將所有內容置於只讀模式。

是否有編程方式(在進程中的任何一步),將文件夾/文件的屬性從只讀更改爲讀寫,以便Web界面仍然正常工作?

回答

3

如何添加運行後部署的自定義代碼活動以將文件的attributes更新爲非FileAttributes.Normal?該活動應該在構建結束時在控制器上運行。

您可能想了解構建定製的Ewald Hofman的series。您的構建服務帳戶可能具有更新部署的文件屬性的正確權限。

希望這會有所幫助。

+0

這正是我們過去某些時候所做的。我們已經獲得幫助編寫了[this]的實際活動(http://stackoverflow.com/questions/1202022/best-way-to-make-a-file-writeable-in-c) – pantelif

+0

我做了類似的事情 –

+0

同樣 - 工作一種享受。 –

1

我碰上了this &假設它也和這個問題有關。

@Duat建議在Build-Agent服務器的範圍內爲我工作。然而,在你的另一個問題中,你提到了一個網絡驅動器 - 所以我想你說的是位於你的構建的放置位置的文件,或者是MSBuild/MSDeploy部署解決方案的目標計算機上的文件。

我會推進第一個假設(所以,我們將重點放在放置位置),但它應該類似於處理這兩種情況。
這個想法基於戰略上的'xcopy'。 (默認情況下'xcopy'在執行期間將所有文件屬性重置爲讀寫)
第一步是構建一個自定義活動,將您需要的文件設置爲讀寫。活動的快速初稿可以在此(它意味着改變一個文件,而不是一個目錄的屬性):

namespace BuildTasks.Activities 
{ 
    using System; 
    using System.Activities; 
    using System.IO; 
    using Microsoft.TeamFoundation.Build.Client; 

    [BuildActivity(HostEnvironmentOption.Agent)] 
    public sealed class MakeFileWriteable : CodeActivity 
    { 
     [RequiredArgument] 
     public InArgument<string> FilePath 
     { 
      get; 
      set; 
     } 

     protected override void Execute(CodeActivityContext context) 
     { 
      String filePath = FilePath.Get(context); 

      //add exception handling 

      FileAttributes fileAttributes = File.GetAttributes(filePath); 
      File.SetAttributes(filePath, fileAttributes & ~FileAttributes.ReadOnly); 
     } 
    } 
} 

第二步,現在,一旦你在構建解決方案有MakeFileWritable,是改變從這個
enter image description here
您的構建定義弄成這個樣子
enter image description here

MakeFileWriteable文件應該從BuildAgent內,是FROMFIL E在調用過程中:
enter image description here
TOFILE是文件應該放置的位置。
請記住在參數中設置「/ Y」,因爲您將覆蓋該文件。