Установщик WIX 3.6 — Visual Studio 2010 (HeatDirectory)

Я работаю над установщиком WIX 3.6 для веб-службы. Но я столкнулся с проблемой при попытке использовать HeatDirectory для сбора всех необходимых выходных данных, и что бы я ни пытался, я получаю следующую ошибку для каждого собранного файла:

Системе не удается найти файл SourceDir\Some.dll...

Ошибки возникают в WcfService.wxs; странно то, что WcfService.wxs автоматически создается разделом HeatDirectory в моем файле проекта (ниже). Как он может ругаться, говоря, что не может найти эти .dll, если ему нужно знать, где они находятся, чтобы создать WcfService.wxs в первую очередь? Эти ошибки возникают даже при загрузке и создании Пример проекта WIX (как есть) из любого из руководств, которые я читал.

Цель: максимально автоматизировать включение .dll (т. е. использовать сбор данных для обработки зависимых проектов и т. д.)

Я использую Win 7 64bit, а проект .NET 4.

Product.wxs:

    <?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="CompleteInstall" Language="1033" Version="1.0.0.0" Manufacturer="Technologies" UpgradeCode="b2ae6aa5-263f-4f9a-a250-8599a7f2cb03">
    <Package InstallerVersion="200" Compressed="yes" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFiles64Folder">
        <Directory Id="CommonDir1" Name="Common Directory 1">
          <Directory Id="CommonDir2" Name="Common Directory 2">
            <Directory Id="INSTALLFOLDER" Name="Install Directory"/>
          </Directory>
        </Directory>
      </Directory>
    </Directory>

    <Feature Id="ProductFeature" Title="CompleteInstall" Level="1">
      <ComponentGroupRef Id="WcfService_Project" />
    </Feature>

    <Property Id="WIXUI_INSTALLDIR">INSTALLFOLDER</Property>
    <UIRef Id="WixUI_InstallDir" />
  </Product>
</Wix>

Файл проекта:

<Target Name="BeforeBuild">
    <MSBuild Projects="%(ProjectReference.FullPath)" Targets="Build" Properties="Configuration=$(Configuration);Platform=x86" Condition="'%(ProjectReference.ContentProject)'=='True'" />
    <PropertyGroup>
      <LinkerBaseInputPaths>%(ProjectReference.RootDir)%(ProjectReference.Directory)bin\$(Platform)\$(Configuration)\</LinkerBaseInputPaths>
    </PropertyGroup>
    <HeatDirectory OutputFile="%(ProjectReference.Filename)-temp.xml" 
                   Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)bin\$(Platform)\$(Configuration)\"
                   DirectoryRefId="INSTALLFOLDER" 
                   ComponentGroupName="%(ProjectReference.Filename)_Project"
                   SuppressCom="true" 
                   SuppressFragments="true" 
                   SuppressRegistry="true"
                   SuppressRootDirectory="true" 
                   AutoGenerateGuids="false" 
                   GenerateGuidsNow="true" 
                   ToolPath="$(WixToolPath)" 
                   Condition="'%(ProjectReference.ContentProject)'=='True'" />
    <XslTransformation XmlInputPaths="%(ProjectReference.Filename)-temp.xml"
                       XslInputPath="XslTransform.xslt" 
                       OutputPaths="%(ProjectReference.Filename).wxs" 
                       Condition="'%(ProjectReference.ContentProject)'=='True'" />
  </Target>

WcfService.wxs:

<?xml version="1.0" encoding="utf-8"?><Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLFOLDER">
            <Component Id="cmpE6EBA3D8D6D4DB0C93E73200C78DCC51" Guid="{C88B5CF9-8807-45DF-AA6F-732437B74BB6}">
                <File Id="fil0118BBA61671E80581CA9C9AA6DD3E8D" KeyPath="yes" Source="SourceDir\Some.dll" />
            </Component>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="WcfService_Project">
            <ComponentRef Id="cmpE6EBA3D8D6D4DB0C93E73200C78DCC51" />
        </ComponentGroup>
    </Fragment>
</Wix>

person alan    schedule 18.05.2012    source источник
comment
Можете ли вы опубликовать полный файл wxs? Вероятно, вы указали неверный каталог для Some.dll...   -  person wimh    schedule 18.05.2012
comment
@Wimmel, я обновил исходный пост полным wxs. Спасибо!   -  person alan    schedule 18.05.2012
comment
@Wimmel, имейте в виду, я заявил, что эта же проблема возникает с примерами проектов, которые я скачал из более чем одного источника.   -  person alan    schedule 18.05.2012
comment
Вы ссылаетесь на WcfService_Project, который должен быть другим файлом в виде фрагментов. См., например, здесь. В связанном вопросе используется Source="PathToFile". Этот PathToFile должен указывать на существующий файл.   -  person wimh    schedule 18.05.2012
comment
@Wimmel, на самом деле это ссылка на wxs, полученную из собранного каталога тепла. Пожалуйста, смотрите мое обновление выше, я добавил этот wxs для вас. Примечание: я также видел тот пример, который вы предоставили до моего сообщения. Спасибо за вашу помощь до сих пор, я действительно ценю это.   -  person alan    schedule 19.05.2012


Ответы (4)


Проблема заключалась в отсутствии свойства HeatDirectory PreprocessorVariable. Я исправил проблему со следующими дополнениями к моему файлу wixproj:

<PropertyGroup>
  <DefineConstants>BasePath=%(ProjectReference.RootDir)%(ProjectReference.Directory);</DefineConstants>
</PropertyGroup>
<HeatDirectory OutputFile="%(ProjectReference.Filename).wxs" 
               DirectoryRefId="INSTALLFOLDER" 
               Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)"
               ComponentGroupName="%(ProjectReference.Filename)_Project"
               SuppressCom="true"
               SuppressFragments="true"
               SuppressRegistry="true"
               SuppressRootDirectory="true"
               AutoGenerateGuids="false"
               GenerateGuidsNow="true"
               ToolPath="$(WixToolPath)"
               Condition="'%(ProjectReference.ContentProject)'=='True'" 
               PreprocessorVariable="var.BasePath"/>

Как видите, сначала мне нужно было определить постоянную переменную для локального использования. Я установил переменную, равную корневому пути моего проекта WCF. Во-вторых, я использовал эту переменную в качестве переменной PreprocessorVariable. Наконец-то я могу динамически/рекурсивно собирать файлы, сгенерированные из MsBuild. Следующий шаг: исключите ненужные файлы. Я буду ссылаться на этот ссылка.

Смотрите ниже мой полный wixproj:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
    <ProductVersion>3.5</ProductVersion>
    <ProjectGuid>{4005592f-cc0e-41a3-8e64-33b2824e7fd9}</ProjectGuid>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputName>MyWCF.WCF.Webservice</OutputName>
    <OutputType>Package</OutputType>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
    <OutputPath>bin\$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
    <OutputPath>bin\$(Configuration)\</OutputPath>
    <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="MyWCF.WcfService.wxs" />
    <Compile Include="IISConfig.wxs" />
    <Compile Include="InstallUi.wxs" />
    <Compile Include="Product.wxs" />
    <Compile Include="UIDialogs.wxs" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\MyWCF.WcfService\MyWCF.WcfService.csproj">
      <Name>MyWCF.WcfService</Name>
      <Project>{8e528b38-2826-4793-a66d-f6ff181e1139}</Project>
      <Private>True</Private>
      <RefProjectOutputGroups>Binaries;Content;Satellites</RefProjectOutputGroups>
      <RefTargetDir>INSTALLFOLDER</RefTargetDir>
      <ContentProject>True</ContentProject>
      <DoNotHarvest>True</DoNotHarvest>
      <PackageThisProject>True</PackageThisProject>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <WixExtension Include="WixIIsExtension">
      <HintPath>$(WixExtDir)\WixIIsExtension.dll</HintPath>
      <Name>WixIIsExtension</Name>
    </WixExtension>
    <WixExtension Include="WixUtilExtension">
      <HintPath>$(WixExtDir)\WixUtilExtension.dll</HintPath>
      <Name>WixUtilExtension</Name>
    </WixExtension>
    <WixExtension Include="WixUIExtension">
      <HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
      <Name>WixUIExtension</Name>
    </WixExtension>
    <WixExtension Include="WixNetFxExtension">
      <HintPath>$(WixExtDir)\WixNetFxExtension.dll</HintPath>
      <Name>WixNetFxExtension</Name>
    </WixExtension>
  </ItemGroup>
  <ItemGroup>
    <Content Include="ConfigurationInitialize.wxi" />
  </ItemGroup>
  <Import Project="$(WixTargetsPath)" />
  <PropertyGroup>
    <PreBuildEvent />
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <MSBuild Projects="%(ProjectReference.FullPath)" Targets="Package" Properties="Configuration=$(Configuration);Platform=$(Platform)" Condition="'%(ProjectReference.PackageThisProject)'=='True'" />
    <PropertyGroup>
      <DefineConstants>BasePath=%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Platform)\$(Configuration)\Package\PackageTmp\</DefineConstants>
    </PropertyGroup>
    <HeatDirectory OutputFile="%(ProjectReference.Filename).wxs" 
                   Directory="%(ProjectReference.RootDir)%(ProjectReference.Directory)obj\$(Platform)\$(Configuration)\Package\PackageTmp"
                   DirectoryRefId="INSTALLFOLDER"
                   ComponentGroupName="%(ProjectReference.Filename)_Project"
                   SuppressCom="true"
                   SuppressFragments="true"
                   SuppressRegistry="true"
                   SuppressRootDirectory="true"
                   AutoGenerateGuids="false"
                   GenerateGuidsNow="true"
                   ToolPath="$(WixToolPath)" Condition="'%(ProjectReference.PackageThisProject)'=='True'"
                   PreprocessorVariable="var.BasePath" />
  </Target>
</Project>
person alan    schedule 02.08.2012
comment
У меня такая же проблема, но пока я не вижу, как это решает проблему. Предполагается ли, что DefineConstants заменяет исходный элемент LinkerBaseInputPaths? - person jpierson; 22.10.2012
comment
@jpierson Я обновил ответ, дайте мне знать, если это не ответ на ваш вопрос. - person alan; 23.10.2012
comment
Хорошо, благодаря вам я верю, что теперь у меня все работает. Мне не хватало атрибута PreprocessorVariable=var.BasePath в вашем элементе HeatDirectory из-за форматирования. Затем мне пришлось заменить все ссылки SourceDir в других моих файлах проекта WIX ссылками на var.BasePath, в том числе в моем XSLT-преобразовании. - person jpierson; 23.10.2012
comment
Я добавлю, что я до сих пор не уверен, почему SourceDir больше не работает в WIX 3.6, хотя казалось, что он работает нормально, следуя руководствам в WIX 3.5. - person jpierson; 23.10.2012
comment
Блестяще спасибо Алан! Я поместил информацию в свой блог, и я скоро изменю исходные сообщения. Спасибо за помощь! - person Chris Surfleet; 09.11.2012

У меня возникла проблема, похожая на вашу, когда я перешел от настройки базового веб-сайта с Wix к одному из наших рабочих.

Предположим, вы следовали примеру пример Пола Рейнольдса и этот Пример парестезии

Если вы посмотрите комментарии на следующей странице - http://blogs.planetsoftware.com.au/paul/archive/2011/02/20/creating-a-web-application-installer-with-wix-3.5-and-visual.aspx

В первом комментарии упоминается об изменении методов предварительной сборки, найденных в примере с Paraesthesia.

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

Мне пришлось удалить свойство преобразования и изменить DirectoryRefId, но пока все хорошо.

Надеюсь, что это поможет указать вам в правильном направлении.

person Lareau    schedule 12.06.2012
comment
Спасибо за предложение. Когда у меня будет возможность, я попробую это и обновлю тему. - person alan; 16.06.2012
comment
Хотя это не было решением моей проблемы, тем не менее, это дало мне толчок в новом направлении. Пожалуйста, смотрите отмеченный ответ. - person alan; 02.08.2012

Обновление: если вы поместите

<PropertyGroup>
<DefineConstants Condition="'%(ProjectReference.WebProject)'=='True'">
%(ProjectReference.Name).PackageDir=%(ProjectReference.RootDir)
%(ProjectReference.Directory)obj\$(Configuration)\Package\PackageTmp\
</DefineConstants>

и добавить:

PreprocessorVariable="var.%(ProjectReference.Name).PackageDir"

см. комментарий внизу. Я не делаю преобразования, поэтому я пропустил это. в HeatDirectory он должен работать без необходимости иметь файл proj внизу.

Это, вероятно, понизит мою репутацию, но я нахожу интересным следующее: site-output-in-a.aspx/" rel="nofollow">http://www.paraesthesia.com, я работал над одним проектом, но при попытке другого он не работал.
Глядя на результаты, казалось, что для «Жара и свечи» выбран правильный проект, но «Свет» выбрал случайный проект. Сравнив два проекта, я заметил, что в рабочем проекте проект для сбора урожая был последним в списке. Когда я переместил проект в файле .wixproj на последнюю ссылку, это сработало.
В настоящее время я использую 3.5.2519. Я знаю, что это старый, но у нас есть проекты, которые требуют, чтобы Harvest был True и фактически Harvest в Visual Studio.

person Pete Hecht    schedule 21.01.2016
comment
Не связанный ответ. - person αƞjiβ; 21.01.2016
comment
WIX трудно понять. Я думаю, что мой ответ действительно отвечает на вопрос. - person Pete Hecht; 21.01.2016

Итак, ваш WcfService.wxs включает в себя:

<File Id="fil0118BBA61671E80581CA9C9AA6DD3E8D" KeyPath="yes" Source="SourceDir\Some.dll" />

Это относится к SourceDir\Some.dll. Этот файл должен существовать на компьютере, где вы компилируете свой проект. Вероятно, вам нужно изменить путь.

person wimh    schedule 19.05.2012
comment
Насколько я понимаю, SourceDir - это ключевое слово для пути, по которому существуют исходные .dll. WcfService.wxs фактически является продуктом собранного каталога тепла (WcfService.wxs создается автоматически). Вопрос в том, как это исправить. Я обновил свой исходный пост, уточнил. - person alan; 21.05.2012
comment
@alan, если вы запускаете тепло каждый раз во время сборки, я думаю, у вас возникнут проблемы во время обновлений, потому что каждый раз создается новый guid. Вы можете добавить параметр -var для обогрева, чтобы указать, что использовать вместо SourceDir. Или используйте параметр -b света, чтобы указать, где хранятся файлы. - person wimh; 21.05.2012
comment
Если я создаю это через Visual Studio 2010 WIX Setup Project, где я могу поместить эту переменную? Вы знаете какие-нибудь примеры? - person alan; 21.05.2012
comment
@Wimmel, вы можете создать файл config.wxi для хранения ваших переменных, а затем сослаться на этот файл в своем проекте установки. Вы можете увидеть несколько примеров использования файла конфигурации здесь: stackoverflow.com/questions/471424/wix-tricks- и-советы - person BryanJ; 23.05.2012