2009-07-06 9 views

答えて

1

MSBuildコミュニティタスクプロジェクトのWebDownloadタスクに加えて、MSBuild拡張パック(現行バージョン:4.x)には、ファイルをダウンロードするために使用できるWebClientクラスがあります。あなたはここにMSBuildの拡張パックをダウンロードすることができます:ここで

は、ファイルをダウンロードするためにMSBuildの拡張パック4を使用した例である:

<Project ToolsVersion="4.0" DefaultTargets="Default" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
<PropertyGroup> 
    <TPath>$(MSBuildProjectDirectory)\..\MSBuild.ExtensionPack.tasks</TPath> 
    <TPath Condition="Exists('$(MSBuildProjectDirectory)\..\..\Common\MSBuild.ExtensionPack.tasks')">$(MSBuildProjectDirectory)\..\..\Common\MSBuild.ExtensionPack.tasks</TPath> 
</PropertyGroup> 
<Import Project="$(TPath)"/> 
<Target Name="Default"> 
    <!-- Download a File--> 
    <MSBuild.ExtensionPack.Web.WebClient TaskAction="DownloadFile" Url="http://hlstiw.bay.livefilestore.com/y1p7GhsJWeF4ig_Yb-8QXeA1bL0nY_MdOGaRQ3opRZS0YVvfshMfoZYe_cb1wSzPhx4nL_yidkG8Ji9msjRcTt0ew/Team%20Build%202008%20DeskSheet%202.0.pdf?download" FileName="C:\TFS Build 2008 DeskSheet.pdf"/> 
    <!-- Get the contents of a Url--> 
    <MSBuild.ExtensionPack.Web.WebClient TaskAction="OpenRead" Url="http://www.msbuildextensionpack.com"> 
     <Output TaskParameter="Data" PropertyName="Out"/> 
    </MSBuild.ExtensionPack.Web.WebClient> 
    <Message Text="$(Out)"/> 
</Target> 

として、別の回答で言及されているように、WebClientは、安全な(パスワード保護エド)ウェブサーバー。

10

認証が必要なファイル(TFS Webやドメインに接続されたIISサーバーなど)をダウンロードしようとしている場合、MSBuild拡張パックもMSBuildコミュニティタスクも、ユーザー名またはパスワードをHTTPサーバーに送信します。この場合、カスタムMSBuildタスクを作成しました。ここに私がしたことがあります。

Stack OverflowユーザーDougのアドバイスに続き、Download a file which requires authentication using vb.net/c#?の回答では、Code GuruのWebサイトでTom Archerによって書かれたメソッドに追加するコードを提案しています。

だから私はWgetの名前のMSBuildのターゲットを作成するには、次のコードで新しいC#プロジェクト(完全なソースコードを示す)を作成するためにMSのVisual Studio 2010を使用:かわりにそれと

// Include references to the following frameworks in your solution: 
// - Microsoft.Build.Framework 
// - Microsoft.Build.Utilities.v4.0 
// - System 
// - System.Net 

using System; 
using System.Net; 
using System.IO; 

using Microsoft.Build.Framework; 
using Microsoft.Build.Utilities; 

namespace Wget 
{ 
    public class Wget: Task 
    { 
     [Required] 
     public String Address // HTTP address to access 
     { get; set; } 

     [Required] 
     public String LocalFilename // Local file to which the downloaded page will be saved 
     { get; set; } 

     public String Username // Credential for HTTP authentication 
     { get; set; } 

     public String Password // Credential for HTTP authentication 
     { get; set; } 

     public override bool Execute() 
     { 
      int read = DownloadFile(Address, LocalFilename, Username, Password); 

      Console.WriteLine("{0} bytes written", read); 

      return true; 
     } 

     public static int DownloadFile(String remoteFilename, String localFilename, String httpUsername, String httpPassword) 
     { 
      // Function will return the number of bytes processed 
      // to the caller. Initialize to 0 here. 
      int bytesProcessed = 0; 

      // Assign values to these objects here so that they can 
      // be referenced in the finally block 
      Stream remoteStream = null; 
      Stream localStream = null; 
      WebResponse response = null; 

      // Use a try/catch/finally block as both the WebRequest and Stream 
      // classes throw exceptions upon error 
      try 
      { 
       // Create a request for the specified remote file name 
       WebRequest request = WebRequest.Create(remoteFilename); 
       if (request != null) 
       { 
        // If a username or password have been given, use them 
        if (httpUsername.Length > 0 || httpPassword.Length > 0) 
        { 
         string username = httpUsername; 
         string password = httpPassword; 
         request.Credentials = new System.Net.NetworkCredential(username, password); 
        } 

        // Send the request to the server and retrieve the 
        // WebResponse object 
        response = request.GetResponse(); 
        if (response != null) 
        { 
         // Once the WebResponse object has been retrieved, 
         // get the stream object associated with the response's data 
         remoteStream = response.GetResponseStream(); 

         // Create the local file 
         localStream = File.Create(localFilename); 

         // Allocate a 1k buffer 
         byte[] buffer = new byte[1024]; 
         int bytesRead; 

         // Simple do/while loop to read from stream until 
         // no bytes are returned 
         do 
         { 
          // Read data (up to 1k) from the stream 
          bytesRead = remoteStream.Read(buffer, 0, buffer.Length); 

          // Write the data to the local file 
          localStream.Write(buffer, 0, bytesRead); 

          // Increment total bytes processed 
          bytesProcessed += bytesRead; 
         } while (bytesRead > 0); 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
      } 
      finally 
      { 
       // Close the response and streams objects here 
       // to make sure they're closed even if an exception 
       // is thrown at some point 
       if (response != null) response.Close(); 
       if (remoteStream != null) remoteStream.Close(); 
       if (localStream != null) localStream.Close(); 
      } 

      // Return total bytes processed to caller. 
      return bytesProcessed; 
     } 
    } 
} 

を、私は追加することができます私のMSBuildプロジェクトに、次のタスクは:

<!-- Get the contents of a Url--> 
<Wget 
    Address="http://mywebserver.com/securepage" 
    LocalFilename="mydownloadedfile.html" 
    Username="myusername" 
    Password="mypassword"> 
</Wget> 

Wgetのタスクはmywebserver.comによって提供ページをダウンロードし、ユーザー名「myusernameと指定」とパスワードを使用して、mydownloadedfile.htmlとして現在の作業ディレクトリ内のファイルに保存します"わたしのパスワード"。

しかし、カスタムWget MSBuildタスクを使用するには、MSBuildにWgetアセンブリファイル(.dll)の場所を伝える必要があります。これは、MSBuildのの要素で行われます:あなたは空想を取得したい場合は、あなたもそれが呼ばれています前に、あなたのMSBuildプロジェクトは、Wgetのを構築することができます

<!-- Import your custom MSBuild task --> 
<UsingTask AssemblyFile="MyCustomMSBuildTasks\Wget\bin\Release\Wget.dll" TaskName="Wget" /> 

。これを行うには、<MSBuild Projects>タスクとソリューションの構築、および、<UsingTaks AssemblyFile>タスクでこのような何か、それをインポートします。

<!-- Build the custom MSBuild target solution--> 
<MSBuild Projects="MyCustomMSBuildTasks\CustomBuildTasks.sln" Properties="Configuration=Release" /> 

<!-- Import your custom MSBuild task --> 
<UsingTask AssemblyFile="MyCustomMSBuildTasks\Wget\bin\Release\Wget.dll" TaskName="Wget" /> 

<!-- Get the contents of a Url--> 
<Wget 
    Address="http://mywebserver.com/securepage" 
    LocalFilename="mydownloadedfile.html" 
    Username="myusername" 
    Password="mypassword"> 
</Wget> 

カスタムMSBuildのターゲットの前に作成されたことがない場合、それはあまりにも難しいことではありませんが - かつてあなたは基本を知っています。上のC#コードを見て、公式のMSDNのドキュメントを見て、Web上でより多くの例を検索してください。開始するには良い場所は次のとおりです。

+0

コミュニティタスクのWebDownloadは認証をサポートするようになりました。 – rasjani

25

のMSBuild 4.0でコンパイルと別のアセンブリにカスタムタスクを展開する必要を避けるためにインライン・タスクを使用することができます。

<UsingTask TaskName="DownloadFile" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <ParameterGroup> 
     <Address ParameterType="System.String" Required="true"/> 
     <FileName ParameterType="System.String" Required="true" /> 
    </ParameterGroup> 
    <Task> 
     <Reference Include="System" /> 
     <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      new System.Net.WebClient().DownloadFile(Address, FileName); 
     ]]> 
     </Code> 
    </Task> 
    </UsingTask> 

    <Target Name="DownloadSomething"> 
    <DownloadFile Address="http://somewebsite/remotefile" FileName="localfilepath" /> 
    </Target> 
+1

これを最初に読んだとき、2つの要素をどこに置くのかは明らかではありませんでした。プロジェクトファイルを含むの上にを追加し、を追加しました。 –

+0

不都合なことに、これはMSBuildのdotnetコアバージョンでは機能しません。 – sakra

関連する問題