2012-03-23 9 views
2

Wixを使用して、次の既存のIIS構造の下に仮想ディレクトリfooを作成します。上記のスニペットでwixを使用してIISのフォルダの下に仮想ディレクトリを作成する方法

//デフォルトのWebサイト/ mywebapp /エディタ

、「mywebappは、」ウェブapplicatoinとエディタがその内部に非仮想フォルダです。私の新しい仮想ディレクトリ 'foo'は非仮想フォルダ 'editor'内に作成する必要があります

私はIIS 7とWix 3.5を使用しています。

上記をタグを使用して行うことはできますか、それを行うためのカスタムアクションを書く必要がありますか?

ありがとうございます。

答えて

0

最後に私はこれに対する簡単な解決策を見つけました。 webvirtualdir要素のエイリアス属性に相対パスを使用できることを知りました。だから私は、次の

  1. <iis:WebSite Id="My.Site" Description="Default Website"> 
        <iis:WebAddress Id="My.Web.Address" Port="12300"/> 
    </iis:WebSite> 
    
  2. はmywebapp /エディタ/ fooのに設定されたエイリアスとwebvirtualdir要素を追加したウェブサイトの要素を使用して既定のWebサイトを参照しました(Webアプリケーション/サブフォルダ/ virtualdir仮想フォルダfooのを作成します)

    <Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
        <Directory Id="INSTALLLOCATION" Name="IISDemo"> 
         <Component Id="IIS.Component" Guid="{6FAD9EC7-D2B0-4471-A657-C8AF5F6F707F}" KeyPath="yes"> 
         <iis:WebVirtualDir Id="My.VirtualDir" Alias="mywebapp/editor/foo" Directory="INSTALLLOCATION" WebSite="My.Site">    
         </iis:WebVirtualDir> 
         </Component> 
        </Directory> 
        </Directory> 
    </Directory> 
    

ソリューションはそれほど単純であることを予想していませんでした。しかし一方で、私は同じことを達成するためにsystem.directoryservicesを使ってカスタムアクションを書いています。しかし、これは簡単できれいです。同じシナリオに直面している人にとっては役に立ちます。ありがとう

0

これは良い質問です。

私は直接の経験はありませんが...同様の問題に直面した場合 - IIS ExtensionとしてISAPIを特定の仮想ディレクトリにWiXを使用してインストールします - 私はJavascriptで実装されたカスタムアクションを使用し、ケース、VBScript。 WiXに必要なものがいくつかあることがわかりましたが、正しい情報を見つけることは難しく、すべてのIIS管理機能がWiX経由で公開されているわけではありません。また、すべてのIIS AdminのものがJavascriptに公開されているわけではありません。あるケースのWMIインターフェイスには、VBArrayが必要です。 !!

また、カスタムアクション内では、IIS WMI(プログラミング)インターフェイスのみに頼るのではなく、実際の作業を行うためにAPPCMD.exeを呼び出すことがあります。あなたがIIS7を前提としているなら、あなたはこれを持っています。 appcmdを使ってvdirやappを作成するのはとても簡単です(appcmd add appまたはappcmd add vdir)。最も難しいのは、私のために、必要なJavascriptとWiXコードをそれに取り付けることでした。ここで私はそれをやった。メインproduct.wxsファイルで

<InstallExecuteSequence> 
    ... 
    <!-- configure extension if we need it --> 
    <Custom Action="CA.AddExtension" After="InstallFiles">NOT Installed AND &amp;F.Binary = 3</Custom> 
    ... 
</InstallExecuteSequence> 

、その後、別のcustomactions.wxsファイルがあります:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
    <Binary Id="B.JavaScript" SourceFile="CustomActions.js" /> 
    <Binary Id="B.VBScript" SourceFile="MoreCustomActions.vbs" /> 

    <CustomAction Id="CA.EnumerateWebSites" 
        BinaryKey="B.JavaScript" 
        JScriptCall="EnumerateWebSites_CA" 
        Execute="immediate" 
        Return="check" /> 

    <CustomAction Id="CA.AddExtension" 
        BinaryKey="B.VBScript" 
        VBScriptCall="AddExtension_CA" 
        Execute="immediate" 
        Return="check" /> 

    .... 

そしてJavaScriptを有効にしてように見えた:

function RunAppCmd(command, deleteOutput) { 
    deleteOutput = deleteOutput || false; 
    LogMessage("RunAppCmd("+command+") ENTER"); 
    var shell = new ActiveXObject("WScript.Shell"); 
    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var tmpdir = fso.GetSpecialFolder(SpecialFolders.TemporaryFolder); 
    var tmpFileName = fso.BuildPath(tmpdir, fso.GetTempName()); 
    var windir = fso.GetSpecialFolder(SpecialFolders.WindowsFolder); 
    var appcmd = fso.BuildPath(windir,"system32\\inetsrv\\appcmd.exe") + " " + command; 

    LogMessage("shell.Run("+appcmd+")"); 

    // use cmd.exe to redirect the output 
    var rc = shell.Run("%comspec% /c " + appcmd + "> " + tmpFileName, WindowStyle.Hidden, true); 
    LogMessage("shell.Run rc = " + rc); 

    if (deleteOutput) { 
     fso.DeleteFile(tmpFileName); 
    } 
    return { 
     rc : rc, 
     outputfile : (deleteOutput) ? null : tmpFileName 
    }; 
} 



// GetWebSites_Appcmd() 
// 
// Gets website info using Appcmd.exe, only on IIS7+ . 
// 
// This fn always returns site state info with each record. 
// 
function GetWebSites_Appcmd() { 
    var ParseOneLine = function(oneLine) { 
     // split the string: capture quoted strings, or a string surrounded 
     // by parens, or lastly, tokens separated by spaces, 
     var tokens = oneLine.match(/"[^"]+"|\(.+\)|[^ ]+/g); 

     // split the 3rd string: it is a set of properties separated by colons 
     var props = tokens[2].slice(1,-1); 
     var t2 = props.match(/\w+:.+?(?=,\w+:|$)/g); 
     var bindingsString = t2[1]; 
     //say(bindingsString); 
     var ix1 = bindingsString.indexOf(':'); 
     var t3 = bindingsString.substring(ix1+1).split(','); 

     var bindings = {}; 
     for (var i=0; i<t3.length; i++) { 
      var split = t3[i].split('/'); 
      var obj = {}; 
      if (split[0] == "net.tcp") { 
       var p2 = split[1].split(':'); 
       obj.port = p2[0]; 
      } 
      else if (split[0] == "net.pipe") { 
       var p3 = split[1].split(':'); 
       obj.other = p3[0]; 
      } 
      else if (split[0] == "http") { 
       var p4 = split[1].split(':'); 
       obj.ip = p4[0]; 
       if (p4[1]) { 
        obj.port = p4[1]; 
       } 
       obj.hostname = ""; 
      } 
      else { 
       var p5 = split[1].split(':'); 
       obj.hostname = p5[0]; 
       if (p5[1]) { 
        obj.port = p5[1]; 
       } 
      } 
      bindings[split[0]] = obj; 
     } 

     // return the object describing the website 
     return { 
      id   : t2[0].split(':')[1], 
      name  : "W3SVC/" + t2[0].split(':')[1], 
      description : tokens[1].slice(1,-1), 
      bindings : bindings, 
      state  : t2[2].split(':')[1] // started or not 
     }; 
    }; 

    LogMessage("GetWebSites_Appcmd() ENTER"); 

    var r = RunAppCmd("list sites"); 
    if (r.rc !== 0) { 
     // 0x80004005 == E_FAIL 
     throw new Exception("ApplicationException", "exec appcmd.exe returned nonzero rc ("+r.rc+")", 0x80004005); 
    } 

    var fso = new ActiveXObject("Scripting.FileSystemObject"); 
    var textStream = fso.OpenTextFile(r.outputfile, OpenMode.ForReading); 
    var sites = []; 

    // Read from the file and parse the results. 
    while (!textStream.AtEndOfStream) { 
     var oneLine = textStream.ReadLine(); 
     var line = ParseOneLine(oneLine); 
     LogMessage(" site: " + line.name); 
     sites.push(line); 
    } 
    textStream.Close(); 
    fso.DeleteFile(r.outputfile); 

    LogMessage("GetWebSites_Appcmd() EXIT"); 

    return sites; 
} 
は、

これは役に立つかもしれません。

+0

あなたの答えcheesoに感謝します。簡単な解決策を見つけて、答えを確認してください... – vinoth

関連する問題