Развертывание нескольких веб-сервисов WCF с помощью набора инструментов WiX — неправильные файлы svc

Я пытаюсь использовать набор инструментов WIX 3.7 в VS2012 для создания установщика для моих служб WFC. Все сервисы получили одинаковую структуру:

Структура службы отдыха

service.svc просто ссылается на конкретный класс

<%@ ServiceHost Language="C#" Debug="true"
    Service="LandwehrServices.Service.Vorlage.ServiceOption" 
    Factory="ServiceCreator.DigestAuthenticationHostFactory" %>

DLL устанавливаются правильно, но все папки содержат один и тот же файл service.svc (первой установленной службы)...

Это мой Product.wxs

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="020f2a79-d085-4c05-b49d-a09300e8a144"
       Name="!(loc.ProductName)"
       Language="1031" 
       Version="1.0.0.0"
       Manufacturer="!(loc.CompanyName)" 
       UpgradeCode="a0bbe6c8-1658-43e4-9cf8-51d6bbdf84d2">

  <Package InstallerVersion="200" Compressed="yes"
         Languages="!(loc.LANG)"
         Manufacturer="!(loc.CompanyName)" Comments="!(loc.Comments)"
         Description="!(loc.Description)" Keywords="!(loc.Keywords)"/>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLLOCATION" Name="!(loc.ProductName)">
          <Directory Id="INSTALLLOCATION.Option" Name="Service.Option" />
          <Directory Id="INSTALLLOCATION.Personal" Name="Service.Personal" />
          <Directory Id="INSTALLLOCATION.Postbox" Name="Service.Postbox" />
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="ProductFeature" Title="!(loc.ProductName)" Level="1">
      <ComponentGroupRef Id="Option_Project" />
      <ComponentGroupRef Id="Personal_Project" />
      <ComponentGroupRef Id="Postbox_Project" />
    </Feature>
</Product>
</Wix>

И моя BeforeBuild запись в .wixdproj

<Target Name="BeforeBuild">
<MSBuild Projects="%(ProjectReference.FullPath)"
         Targets="Package"
         Properties="Configuration=$(Configuration);Platform=AnyCPU"
         Condition="'%(ProjectReference.WebProject)'=='True'" />
<ItemGroup>
  <LinkerBindInputPaths Include="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\" />
</ItemGroup>
<HeatDirectory OutputFile="%(ProjectReference.Filename).wxs"
               Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\"
               DirectoryRefId="INSTALLLOCATION.%(ProjectReference.Filename)"
               ComponentGroupName="%(ProjectReference.Filename)_Project"
               AutogenerateGuids="true" SuppressCom="true" SuppressFragments="true" SuppressRegistry="true"
               SuppressRootDirectory="true" ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.WebProject)'=='True'" />
</Target>

Любые идеи? Я впервые использую WIX...


person Dust258    schedule 22.10.2013    source источник
comment
Исходные файлы по адресу ...\Mobile\Service.Personal\obj\Debug\Package\PackageTmp содержат правильный код. Если я переименую service.svc в индивидуальное имя, например servicePersonal.svc, все будет работать нормально. Есть ли временный каталог, куда файлы копируются во время установки?   -  person Dust258    schedule 23.10.2013


Ответы (2)


В порядке. Это решило проблему для меня.

Принудительный вызов компоновщика с именованными путями привязки

Я добавил следующую группу элементов с элементами, указывающими на два пакета.

<ItemGroup>
    <BindInputPaths Include="..\MyProject1\obj\Debug\Package\PackageTmp">
      <BindName>MyProject1</BindName>
      <InProject>false</InProject>
    </BindInputPaths>
    <BindInputPaths Include="..\MyProject2\obj\Debug\Package\PackageTmp">
      <BindName>MyProject2</BindName>
      <InProject>false</InProject>
    </BindInputPaths>
</ItemGroup>

Удалите группу элементов на этапе перед сборкой, содержащую элемент LinkerBindInputPaths.

Проверьте это в окне вывода Visual Studio. Командная строка Light.exe теперь должна иметь именованные пути привязки.

-b "MyProject1=D:\Projects\...\MyProject1\obj\Debug\Package\PackageTmp" 
-b "MyProject2=D:\Projects\...\MyProject2\obj\Debug\Package\PackageTmp"

Использовать именованные пути привязки в выходных данных урожая

Я попытался получить задачу HeatDirectory для создания этого вывода, но в конце концов просто использовал преобразование XSLT, чтобы обновить часть SourceDir, чтобы использовать переменную bindpath.

Обновите проект Wix, чтобы направить вывод тепла в файл tmp перед передачей через XSLT-преобразование.

<HeatDirectory OutputFile="%(ProjectReference.Filename)-temp.wxs" 
               Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\" 
               DirectoryRefId="%(ProjectReference.Name)InstallFolder" 
               ComponentGroupName="%(ProjectReference.Name)_Project" 
               AutogenerateGuids="true" 
               SuppressCom="true" 
               SuppressFragments="true" 
               SuppressRegistry="true" 
               SuppressRootDirectory="true" 
               ToolPath="$(WixToolPath)" 
               Condition="'%(ProjectReference.WebProject)'=='True'" />

<XslTransformation XmlInputPaths="%(ProjectReference.Filename)-temp.wxs" 
                   XslInputPath="XslTransform.xslt" 
                   OutputPaths="%(ProjectReference.Filename).wxs" 
                   Condition="'%(ProjectReference.WebProject)'=='True'" />

Включите преобразование XSLT в проект Wix (XslTransform.xslt)

<?xml version="1.0" encoding="utf-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
                exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="string-replace-all">
    <xsl:param name="text" />
    <xsl:param name="replace" />
    <xsl:param name="by" />
    <xsl:choose>
      <xsl:when test="contains($text, $replace)">
        <xsl:value-of select="substring-before($text,$replace)" />
        <xsl:value-of select="$by" />
        <xsl:call-template name="string-replace-all">
          <xsl:with-param name="text" select="substring-after($text,$replace)" />
          <xsl:with-param name="replace" select="$replace" />
          <xsl:with-param name="by" select="$by" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="@Source['SourceDir']" >

    <xsl:attribute name="Source">

      <xsl:variable name="projectName">
        <xsl:value-of select="/wix:Wix/wix:Fragment/wix:ComponentGroup/@Id"/>
      </xsl:variable>

      <xsl:call-template name="string-replace-all">
        <xsl:with-param name="text" select="." />
        <xsl:with-param name="replace" select="'SourceDir'" />
        <xsl:with-param name="by" select="concat('!(bindpath.',$projectName,')')" />
      </xsl:call-template>

    </xsl:attribute>

  </xsl:template>

</xsl:stylesheet>

Выход Heat должен использовать имя ComponentGroup в качестве переменной пути привязки.

<Component Id="..." Guid="*">
    <File Id="..." KeyPath="yes" Source="!(bindpath.MyProject1)\Default.aspx" />
</Component>

После сборки я проверил MSI в Orca. Перед исправлением Orca перечислила две версии моих файлов с одинаковым размером байта. Теперь в нем перечислены обе версии с их правильными размерами.

person Andy Reed    schedule 24.10.2013
comment
OMG, я не могу поверить, что это действительно сработало. Я трачу 2 дня, пытаясь найти решение этой проблемы. Большое спасибо ^^ - person Dust258; 24.10.2013
comment
Не волнуйтесь. Это вызывало у меня головную боль тоже. - person Andy Reed; 24.10.2013

В настоящее время у меня точно такая же проблема. Я считаю, что это вызвано путями привязки компоновщика (Light). Они берут две упакованные выходные папки и объединяют их. Глядя на командную строку компоновщика в выводе VS, он использует флаг –b для указания путей привязки. Когда есть несколько путей, я считаю, что он должен использовать именованные пути.

http://wixtoolset.org/documentation/manual/v3/howtos/general/specifying_source_files.html

C:\Program Files (x86)\WiX Toolset v3.7\bin\Light.exe 
-out "D:\Projects\...\Setup.msi" 
-pdbout "D:\Projects\...\Setup.wixpdb" 
-b "D:\Projects\...\MyProject1\obj\Debug\Package\PackageTmp\\" 
-b "D:\Projects\...\MyProject2\obj\Debug\Package\PackageTmp\\" 
-cultures:en-us -ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixUtilExtension.dll" 
-ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixIIsExtension.dll" 
-ext "C:\Program Files (x86)\WiX Toolset v3.7\bin\\WixUIExtension.dll" 
-loc WebAppInstallDlg_en-us.wxl -contentsfile obj\Debug\Setup.wixproj.BindContentsFileListen-us.txt 
-outputsfile obj\Debug\Setup.wixproj.BindOutputsFileListen-us.txt 
-builtoutputsfile obj\Debug\Setup.wixproj.BindBuiltOutputsFileListen-us.txt 
-wixprojectfile "D:\Projects\...\Setup.wixproj" obj\Debug\MyProject1.wixobj obj\Debug\MyProject2.wixobj obj\Debug\SetupUI.wixobj obj\Debug\Setup.wixobj

Я думаю, что решение состоит в том, чтобы использовать именованные пути привязки. Однако мне не удалось найти способ указать именованные пути привязки на этапе предварительной сборки. Мой шаг перед сборкой идентичен вашему, поэтому я пытаюсь выяснить, как изменить часть LinkerBindInputPaths на используемые имена, как показано ниже.

<File Source="!(bindpath.foo)bar\baz.txt" />
<File Source="!(bindpath.bar)baz\foo.txt" />

light -b foo=C:\foo\ -b bar=C:\bar\ -b foo=D:\

Энди.

person Andy Reed    schedule 23.10.2013