2017-12-08 7 views
0

VSTS에서 호스팅 된 빌드 에이전트를 사용하여 클라우드 서비스를 구축하고 배포합니다.Azure 클라우드 서비스 패키지 - 호스팅 된 VSTS 빌드 서버의 물리적/가상 경로 찾기

클라우드 서비스를 패키징 할 때 cspack.exe는 가상 경로의 실제 디렉터리를 찾을 수 없다는 불만을 표시합니다.

.... 
    <WebRole name="MySite" vmsize="Small"> 
    <Sites> 
     <Site name="Web"> 
     <VirtualDirectory name="media" physicalDirectory="Z:\MySiteMedia" /> 
     <Bindings> 
.... 

ServiceDefinition.csdef : 오류 CloudServices079는 : 가상 경로 웹/미디어 /의 경우 : 실제 디렉터리 '\ MySiteMedia Z'를 찾을 수 없습니다.

물리적 서버가 빌드 서버에는 없지만 클라우드 서비스가 배포 될 서버에 존재한다는 것은 사실입니다. Azure 파일 공유입니다.

해결 방법이 있습니까?

업데이트

그것은 필요한 드라이브 문자와 폴더가 빌드 에이전트에 가상 드라이브를 만들 수 있습니다. 드라이브가 다른 로컬 드라이브를 가리킬 수 있습니다. intance를 들어, Z는 C : \ 가리키는 수 :

예 : \

net use Z: \\localhost\c$\MySiteMedia 

이 빌드 문제를 해결합니다, 그러나, 실제 문제를 해결 나던.

일부 파기 후, 나는 원래 생각대로 cspack이 작동하지 않는다는 것을 알았습니다. ServiceDefition에

<VirtualDirectory> 

을 추가 할 때 해당 폴더의 내용을 가져와 cspkg 파일에 패키지화합니다. 그런 다음 새 폴더를 만들어 siteroot 폴더에 저장 한 다음 해당 새 폴더에 대한 가상 디렉터리를 만듭니다.

예 : \ 사용되지 않습니다 :

enter image description here

가 Z에 푸른 파일 공유는 것을 의미한다

enter image description here

된다.

해결 방법은 RoleEntryPoint를 사용하여 역할을 배포 한 후 IIS에 가상 디렉터리를 추가하는 것입니다.

답변

0

저는 RoleEntryPoint를 만들어서 문제를 해결했습니다. RoleEntryPoint는 내 역할을위한 초기화 코드를 실행합니다. 이것은 역할이 전개 된 후에 발생합니다. 코드는 역할 자체의 모든 폴더에 배치 할 수 있습니다.

Microsoft.Web.Administration은 IIS에 가상 디렉터리를 추가하는 데 사용됩니다. 이 클라우드 서비스에 배포 할 때 런타임 예외를 제공하는 CORE 프로젝트를 참조 때문에, NuGet에서 Microsoft.Web.Administration을 사용하여 몇 가지 문제가 있었다 :

(System.IO.FileNotFoundException : 파일을로드 할 수 없습니다 또는 조립 'System.Runtime, 버전 = 4.1.0.0은, 문화 = 중립은 ..)

그래서 나는 C에서 Microsoft.Web.Administration.dll 참조 : \ WINDOWS \ system32를 입력 \ inetsrv를 \ -을 얻으려면 DLL을 사용하여 개발 컴퓨터에 IIS를 설치해야합니다.

코드는 IIS의 첫 번째 사이트에 가상 디렉터리를 추가합니다. 여러 사이트가있는 경우 필요에 따라 수정해야합니다.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.IO; 
using System.Linq; 
using Microsoft.Web.Administration; 
using Microsoft.WindowsAzure.ServiceRuntime; 
using Newtonsoft.Json; 

namespace MyNamespace.Azure 
{ 
    public class WebRole : RoleEntryPoint 
    { 
     public override bool OnStart() 
     { 
      try 
      { 
       // Add initialization code here 
       var serverManager = new ServerManager(); 
       var site = serverManager.Sites.First(); 
       var application = site.Applications.First(); 

       Trace.WriteLine($"First site: {site.Name} "); 
       Trace.WriteLine($"First application path for site {site.Name}: {application.Path}"); 

       var vDirs = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(@"Azure\VirtualDirectories.json")); 

       var vDirsToDelete = new List<VirtualDirectory>(); 
       foreach (var vDir in vDirs) 
       { 
        var virtualDirectories = application.VirtualDirectories.Where(x => x.Path == vDir.Key).ToList(); 
        vDirsToDelete.AddRange(virtualDirectories); 
       } 

       if (vDirsToDelete.Any()) 
       { 
        foreach (var vDir in vDirsToDelete) 
        { 
         Trace.WriteLine($"Removing existing media virtual directory"); 
         application.VirtualDirectories.Remove(vDir); 
        } 
       } 

       foreach (var vDir in vDirs) 
       { 
        Trace.WriteLine($"Adding virtual directory. Address: {vDir.Key}, PhysicalPath: {vDir.Value}"); 
        application.VirtualDirectories.Add(vDir.Key, vDir.Value); 
       } 

       serverManager.CommitChanges(); 

      } 
      catch (Exception e) 
      { 
       Trace.WriteLine("Exception during OnStart: " + e); 
       // Take other action as needed. 
      } 

      return base.OnStart(); 
     } 
    } 
} 

VirtualDirectories.json : 귀하의 답변에 대한

{ 
    "media": "Z:\\MySiteMedia" 
} 
0

Azure Docs에 따르면이 속성은 파일이 프로덕션 환경에 배치 될 디렉토리가 아닌 개발 시스템 또는 시나리오의 빌드 시스템에 컨텐츠가 존재하는 디렉토리를 정의합니다.

https://msdn.microsoft.com/en-us/library/azure/gg557553.aspx#Site

필수. 웹 사이트 또는 가상 디렉터리 내용이 인 개발 컴퓨터의 경로를 지정합니다. 컴퓨팅 에뮬레이터에서 IIS는이 위치에서 콘텐츠를 검색하도록 구성됩니다.Azure에 을 배포하면 실제 디렉토리의 내용은 나머지 서비스와 함께 패키지됩니다. 서비스 패키지가 Azure에 배포되면 IIS는 압축되지 않은 내용의 위치로 구성됩니다.

+0

감사합니다. 당신은 절대적으로 옳다. 문서에 의하면 - 실제 디렉토리가 건설 기계에 존재해야한다. 불행히도, 나는 무례하다는 뜻은 아닙니다. 답은 해결책을 제시하지 못합니다. – Kenci