2012-05-18 20 views
11

Sto lavorando su un programma di installazione WIX 3.6 per un servizio web. Ma ho incontrato un problema quando si tenta di utilizzare un HeatDirectory per raccogliere tutta l'uscita necessaria e non importa quello che cerco io ottenere il seguente errore per ogni file raccolti:WIX 3.6 Installer - Visual Studio 2010 (HeatDirectory)

Il sistema non riesce a trovare il file ' SourceDir \ Some.dll ... '

Gli errori si verificano in WcfService.wxs; la parte strana è che WcfService.wxs viene automaticamente creato dalla sezione heatdirectory nel mio file di progetto (sotto). Come può saltare in aria dicendo che non è possibile trovare questi file .dll se deve sapere dove sono per creare WcfService.wxs in primo luogo? Questi errori si verificano anche quando si scarica e si costruisce un progetto di esempio WIX (così com'è) da una qualsiasi delle esercitazioni che ho letto.

L'obiettivo: Per automatizzare la maggior quantità di inclusione dll possibile (cioè utilizzare la raccolta di gestire progetti di dipendenza, ecc)

Sto correndo Win 7 64 bit e il progetto è .NET 4 .

Product.wxs: file di

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

Progetto:

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

Puoi pubblicare il file completo wxs? Probabilmente non hai inserito una directory corretta per Some.dll ... – wimh

+0

@Wimmel, ho aggiornato il post originale con le wx complete. Grazie! – alan

+0

@Wimmel, tieni presente che ho dichiarato che lo stesso problema si verificava con progetti di esempio che ho scaricato da più di una fonte. – alan

risposta

12

Il problema era l'assenza della proprietà PreprocessoreVariabile di HeatDirectory.Ho risolto il problema con le seguenti aggiunte al mio file 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"/> 

Come potete vedere, avevo bisogno di definire prima una variabile costante per uso locale. Ho impostato la variabile uguale al percorso root del mio progetto WCF. In secondo luogo ho usato quella variabile come mia PreprocessoreVariabile. Finalmente sono in grado di raccogliere in modo dinamico/ricorsivo i file generati da MsBuild. Passaggio successivo: escludi i file non necessari. Mi riferirò a questo link.

Vedere sotto la mia completa 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

Sto avendo lo stesso problema ma finora non vedo come questo risolva il problema. DefineConstants dovrebbe sostituire l'elemento LinkerBaseInputPaths originale? – jpierson

+1

@jpierson Ho aggiornato la risposta, fammi sapere se questo non risponde alla tua domanda. – alan

+0

Ok, grazie a voi credo di aver tutto funzionante ora. Mi mancava l'attributo PreprocessorVariable = "var.BasePath" sull'elemento HeatDirectory a causa della formattazione. Successivamente ho dovuto sostituire tutti i riferimenti SourceDir negli altri miei file di progetto WIX con riferimenti a var.BasePath incluso nella mia trasformazione XSLT. – jpierson

-1

Così i vostri WcfService.wxs comprende:

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

Questo si riferisce al SourceDir\Some.dll. Questo file deve esistere sul pc in cui si compila il progetto. Probabilmente hai bisogno di cambiare il percorso.

+0

Da quanto ho capito SourceDir è una parola chiave per il percorso in cui esistono i file di origine .dll. WcfService.wxs è in effetti il ​​prodotto della heatdirectory raccolta (WcfService.wxs viene creato automaticamente). La domanda è come risolverlo. Ho aggiornato il mio post originale per chiarire. – alan

+1

@alan se si esegue calore ogni volta durante la compilazione, penso che si verifichino problemi durante gli aggiornamenti perché ogni volta viene generato un nuovo guid. Puoi aggiungere un [parametro -var] (http://stackoverflow.com/a/8590298/33499) a heat per specificare cosa usare al posto di SourceDir. Oppure usa l'opzione [-b] (http://stackoverflow.com/a/6920979/33499) di luce per specificare dove sono archiviati i file. – wimh

+0

Se sto costruendo questo tramite Progetto di installazione WIX di Visual Studio 2010 dove inserisco questa variabile? Conosci qualche esempio? – alan

2

Stavo riscontrando un problema simile al tuo quando mi sono trasferito dalla creazione di un sito Web di base con Wix a uno dei nostri siti di produzione.

Supponendo che stavi seguendo esempio Paul Reynolds' example e questo Paraesthesia's example

Se si guarda nei commenti della pagina seguente - http://blogs.planetsoftware.com.au/paul/archive/2011/02/20/creating-a-web-application-installer-with-wix-3.5-and-visual.aspx

Il primo commento menziona cambiando i metodi BeforeBuild trovati nell'esempio di parestesia.

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

Ho dovuto rimuovere la proprietà di trasformazione e modificare DirectoryRefId ma finora tutto bene.

La speranza che ti aiuta a orientarti nella giusta direzione.

+0

grazie per il suggerimento. Quando avrò l'opportunità, proverò questo e aggiornerò il thread. – alan

+0

Sebbene questa non fosse la soluzione al mio problema, tuttavia mi ha avviato in una nuova direzione. Si prega di vedere la risposta contrassegnata. – alan

0

Update: Se si mette

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

e aggiunge:

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

See the comment towards the bottom. Non faccio una trasformazione, quindi l'ho lasciato fuori. a HeatDirectory dovrebbe funzionare senza dover avere il file proj in basso.

Probabilmente questo diminuirà la mia reputazione, ma quello che trovo interessante è il sito http://www.paraesthesia.com, ho lavorato per un progetto, ma quando ne ho provato un altro non funzionava.
Dopo aver esaminato l'output sembrava prendere il progetto corretto per Calore e Candela, ma la Luce sembrava prenderne uno a caso. Dopo aver confrontato i due progetti, ho notato che il progetto di lavoro aveva il progetto da raccogliere come l'ultimo progetto elencato. Quando ho spostato il progetto nel file .wixproj all'ultimo riferimento, ha funzionato.
Attualmente sto usando 3.5.2519. So che è vecchio, ma abbiamo progetti che richiedono Harvest to True e in realtà Harvest in Visual Studio.

+0

Non una risposta correlata. –

+0

WIX è difficile da capire Penso che la mia risposta risponda alla domanda. –