2012-05-18 12 views
11

Pracuję na instalatorze WIX 3.6 dla usługi sieci Web. Ale napotkam problem przy próbie użycia HeatDirectory do zebrania wszystkich niezbędnych danych wyjściowych i niezależnie od tego, co próbuję, pojawia się następujący błąd dla każdego zebranego pliku:Instalator WIX 3.6 - Visual Studio 2010 (HeatDirectory)

System nie może odnaleźć pliku " SourceDir \ Some.dll ... '

Błędy występują w pliku WcfService.wxs; Najdziwniejsze jest to, że WcfService.wxs jest automatycznie tworzony przez sekcję heatdirectory w moim pliku projektu (poniżej). Jak to może być wysadzenie w powietrze, mówiąc, że nie może znaleźć tych. Dll, jeśli musi wiedzieć, gdzie są one do stworzenia WcfService.wxs w pierwszej kolejności? Te błędy występują nawet podczas pobierania i tworzenia projektu WIX Example (tak jak jest) z dowolnego z samouczków, które przeczytałem.

Celem: Aby zautomatyzować jak najwięcej jak to możliwe włączenie .dll (czyli wykorzystanie zbiorów do obsługi projektów z zależnościami, etc.)

biegnę Win 7 64bit i projekt jest .NET 4 .

Product.wxs: plik

<?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> 

Projekt:

<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> 
+0

Czy możesz opublikować pełny plik wxs? Prawdopodobnie nie wprowadziłeś poprawnego katalogu dla Some.dll ... – wimh

+0

@Wimmel, zaktualizowałem oryginalny post z kompletnymi WXS. Dzięki! – alan

+0

@Wimmel, należy pamiętać, Stwierdziłem, że ten sam problem występuje z przykładowymi projektami pobranymi z więcej niż jednego źródła. – alan

Odpowiedz

12

Problem polegał na braku właściwości PreprocessorVariable HeatDirectory.Naprawiłem problem z następującymi dodatkami do mojego pliku 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"/> 

Jak widać, musiałem najpierw zdefiniować stałą zmienną do użytku lokalnego. Ustawiam zmienną równą głównej ścieżce mojego projektu WCF. Po drugie użyłem tej zmiennej jako mojej PreprocessorVariable. Wreszcie jestem w stanie dynamicznie/rekursywnie zbierać pliki wygenerowane z MsBuild. Następny krok: wyklucz niepotrzebne pliki. Odniosę się do tego link.

Zobacz poniżej mojego kompletnego 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> 
+0

Mam ten sam problem, ale jak dotąd nie widzę, jak to rozwiązuje problem. Czy DefineConstants ma zastąpić oryginalny element LinkerBaseInputPaths? – jpierson

+1

@jpierson Zaktualizowałem odpowiedź, daj mi znać, jeśli to nie odpowie na twoje pytanie. – alan

+0

Ok, dzięki tobie wierzę, że mam wszystko teraz działa. Brakowało mi atrybutu PreprocessorVariable = "var.BasePath" na twoim elemencie HeatDirectory z powodu formatowania. Następnie musiałem zastąpić wszystkie odwołania do SourceDir w innych plikach projektu WIX z odniesieniami do var.BasePath, w tym w mojej transformacji XSLT. – jpierson

-1

więc WcfService.wxs obejmuje:

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

ten odnosi się do SourceDir\Some.dll. Ten plik musi istnieć na komputerze, na którym kompilujesz swój projekt. Prawdopodobnie musisz zmienić ścieżkę.

+0

Z tego co rozumiem SourceDir jest słowem kluczowym dla ścieżki, w której istnieją .dll źródła. WcfService.wxs jest w rzeczywistości produktem zebranego katalogu heatdirectory (automatycznie tworzony jest WcfService.wxs). Pytanie brzmi, jak to naprawić. Zaktualizowałem mój pierwotny post, wyjaśniając. – alan

+1

@ Jeśli uruchomisz ciepło za każdym razem podczas kompilacji, myślę, że dostaniesz problemy podczas aktualizacji, ponieważ za każdym razem generowany jest nowy przewodnik. Możesz dodać [parametr -var] (http://stackoverflow.com/a/8590298/33499) do podgrzania, aby określić, co należy użyć zamiast SourceDir. Lub użyj opcji [-b] (http://stackoverflow.com/a/6920979/33499) światła, aby określić miejsce przechowywania plików. – wimh

+0

Jeśli buduję to za pomocą programu Visual Studio 2010 WIX Setup Project, gdzie umieścić tę zmienną? Czy znasz jakieś przykłady? – alan

2

byłem coraz podobny problem do Ciebie, kiedy przeniósł się z skonfigurowaniu podstawowego stronie z Wix do jednego z naszych nich produkcji.

Zakładając, że były następujące przykładowe Paul Reynolds' example i ten Paraesthesia's example

Jeśli spojrzeć w komentarzach następnej stronie - http://blogs.planetsoftware.com.au/paul/archive/2011/02/20/creating-a-web-application-installer-with-wix-3.5-and-visual.aspx

Pierwszy komentarz wspomina zmianę znalezione w przykładzie parestezje Metody beforebuild.

 <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> 

Musiałem usunąć właściwość transform i zmienić DirectoryRefId, ale do tej pory tak dobrze.

Mam nadzieję, że pomoże wskazać ci właściwy kierunek.

+0

dziękuję za sugestię. Kiedy dostanę okazję, spróbuję tego i zaktualizuję wątek. – alan

+0

Chociaż to nie było rozwiązanie mojego problemu, jednak zaczęło to w nowym kierunku. Zobacz zaznaczoną odpowiedź. – alan

0

Update: Jeśli umieścisz

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

i dodać:

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

See the comment towards the bottom. Nie robię transformacji, więc zostawiłem to. do HeatDirectory powinien działać bez konieczności posiadania pliku proj na dole.

To prawdopodobnie obniży moją reputację, ale to, co uważam za interesujące, to strona http://www.paraesthesia.com, czy pracowałem dla jednego projektu, ale gdy próbowałem innego, to nie działało.
Po obejrzeniu wyjścia zdawało się, że wziął prawidłowy projekt na ciepło i świecę, ale Światło zdawało się brać losowo. Po porównaniu dwóch projektów zauważyłem, że projekt roboczy miał projekt do zebrania jako ostatni wymieniony projekt. Kiedy przeniosłem projekt w pliku .wixproj do ostatniego odnośnika, zadziałało.
Obecnie używam wersji 3.5.2519. Wiem, że jest stary, ale mamy projekty, które wymagają Harvest to True, a właściwie Harvest w Visual Studio.

+0

Brak pokrewnej odpowiedzi. –

+0

WIX jest trudny do zrozumienia Myślę, że moja odpowiedź odpowiada na pytanie. –

Powiązane problemy