2014-12-02 2 views
1

Я использую _PublishedApplications для создания структуры на сервере сборки TFS. После этого я использую <HeatDirectory> в проекте WiX, чтобы правильно собрать содержимое папки _PublishedApplications. Но моя проблема - это порядок во время сборки.Как заказать сбор данных перед сборкой?

Если я использую <HeatDirectory> внутри <Target Name="BeforeBuild">, он не содержит двоичные файлы, скопированные в _PublishedApplications, поскольку сбор урожая выполняется перед публикацией (копия файла).

Если я изменю цель на BeforeCompile, компиляция не будет успешной, потому что на первом месте нет файла. Вот код для проекта WiX (соответствующая часть):

<ItemGroup> 
    <Compile Include="Product.wxs" /> 
    <Compile Include="Autogenerated.wxs" /> 
    </ItemGroup> 
    <ItemGroup> 
    <ProjectReference Include="..\SimpleProject\SimpleProject.csproj"> 
     <Name>SimpleProject</Name> 
     <Project>{GUID}</Project> 
     <Private>True</Private> 
     <DoNotHarvest>True</DoNotHarvest> 
     <RefProjectOutputGroups>Binaries</RefProjectOutputGroups> 
     <RefTargetDir>INSTALLFOLDER</RefTargetDir> 
    </ProjectReference> 
    </ItemGroup> 
    <Import Project="$(WixTargetsPath)" /> 
    <Target Name="BeforeCompile"> 
    <HeatDirectory OutputFile="Autogenerated.wxs" Directory="$(Sources)" 
        PreprocessorVariable="var.SimpleProject.TargetDir" 
        AutogenerateGuids="true" SuppressRegistry="true" 
        ToolPath="$(WixToolPath)" DirectoryRefId="INSTALLFOLDER" 
        ComponentGroupName="ComponentGroup_Core" 
        SuppressRootDirectory="true" /> 
    </Target> 

Вопрос

Как я могу выполнить уборку после того, как двоичные файлы копируются в _PublishedApplications?

ответ

1

я строю мое решение, используя следующую команду:

msbuild SimpleInstaller.sln /p:OutDir=C:\Temp\Output\ /v:diag > C:\Temp\Log.txt 

выход Это будет все войти в текстовый файл. Вместо этого вы можете использовать MSBuild logger.

Тогда я нашел, когда вы строите проект C#, цель Compile в файле Вызывается Microsoft.Common.targets. Эта цель имеет атрибут DependsOnTarget, который содержит ссылку на цель BeforeCompile.

я могу переопределить эту цель BeforeCompile в моем C# проекта, просто добавив следующий код в конце его (файл .csproj):

... 
    <Target Name="BeforeCompile"> 
    <!-- custom action. --> 
    </Target> 
</Project> 

Но проблема моя WiX проект не может переопределить цель BeforeCompile, потому что эта цель не определена для проектов WiX. Вы можете проверить это в файле wix2010.targets. Цель Compile имеет только зависимость от целей PrepareForBuild, ResolveWixExtensionReferences и GenerateCompileWithObjectPath.

Моим решением было идентифицировать альтернативу BeforeCompile, которая является целью Harvest. Мой проект WiX (.wixproj) имеет следующую цель в настоящее время:

<Target Name="Harvest"> 
    <HeatDirectory OutputFile="Autogenerated.wxs" Directory="$(Sources)" 
       PreprocessorVariable="var.SimpleProject.TargetDir" 
       AutogenerateGuids="true" SuppressRegistry="true" 
       ToolPath="$(WixToolPath)" DirectoryRefId="INSTALLFOLDER" 
       ComponentGroupName="ComponentGroup_Core" 
       SuppressRootDirectory="true" /> 
</Target> 

Все это произошло потому, что проблема мой первый проект в решении был проект WiX и только потом я добавил проекты C#. По этой причине BeforeBuild выполнялся перед всем остальным.

Другое решение, чтобы решить эту проблему, чтобы отредактировать файл решения (.sln) и переместить проектную декларацию WiX в начале файла решения до конца всех деклараций проекта (не конец файла решения). Затем проект BeforeBuild проекта WiX будет выполнен после создания папки _PublishedApplications проектом C#.

Это руководство редактирования требуется, потому что если вы измените проект порядка сборки вы фактически изменяющие ссылки на проекты (по крайней мере, в файле решения), но цель BeforeBuild называется в любом случае перед ResolveProjectReferences, который является ответственным за вызов построение любых ссылок.

Это проект декларации, который должен быть после того, как все остальные:

Project("GUID") = "SimpleInstaller", "SimpleInstaller\SimpleInstaller.wixproj", "GUID" 
EndProject 

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

+0

Вы не должны редактировать файл решения напрямую. В VS есть возможность сделать это. Прочитайте обновление в своем ответе. – Rolo

+0

Даже если вы измените заказ сборки проекта, при выполнении сборки первая цель - это первый проект в файле. Затем вызывается BeforeBuild для этого первого проекта. Только после вызова функции BeforeBuild вызывается ResolveProjectReferences, поэтому даже если вы измените порядок сборки, добавив ссылки на проект, в этом конкретном случае это не сработает. – Marlos

+0

У меня есть файл решения (VS 2013u5 - 12.0.40629.0), где .wixproj определяется последним (из проекта refs) в файле, но я все еще наблюдаю за тем, как вызывается передняя задача PreBuild для .wixproj создаются зависимые проекты. –

0

Первое, что вам нужно сделать, это добавить ссылку на проект из проекта установщика в проект приложения. Это заставит приложение создавать и быть доступным для вашего проекта установщика.

Вы можете проверить последовательность сборки проектов, если вы щелкните правой кнопкой мыши свое решение под VisualStudio и выберите «Проект сборки проекта ...», если вам нужно изменить порядок, необходимый для настройки зависимостей проекта.

Затем сделать что-то вроде этого в вашем проекте инсталлятора:

<PropertyGroup> 
     <RootDir>{PATH TO _PublishedApplications FOLDER}</RootDir> 
     <HarvestDirectoryNoLogo>true</HarvestDirectoryNoLogo> 
     <HarvestDirectorySuppressAllWarnings>false</HarvestDirectorySuppressAllWarnings> 
     <HarvestDirectoryTreatWarningsAsErrors>false</HarvestDirectoryTreatWarningsAsErrors> 
     <HarvestDirectoryTreatSpecificWarningsAsErrors> 
     </HarvestDirectoryTreatSpecificWarningsAsErrors> 
     <HarvestDirectoryVerboseOutput>false</HarvestDirectoryVerboseOutput> 
     <HarvestDirectoryAutogenerateGuids>false</HarvestDirectoryAutogenerateGuids> 
     <HarvestDirectoryGenerateGuidsNow>true</HarvestDirectoryGenerateGuidsNow> 
     <HarvestDirectorySuppressFragments>true</HarvestDirectorySuppressFragments> 
     <HarvestDirectorySuppressUniqueIds>false</HarvestDirectorySuppressUniqueIds> 
    </PropertyGroup> 
    <Import Project="$(WixTargetsPath)" /> 
    <Target Name="BeforeBuild"> 
     <ItemGroup> 
      <HarvestDirectory Include="$(RootDir)"> 
       <Transforms> 
       </Transforms> 
       <ComponentGroupName>MyComponent</ComponentGroupName> 
       <DirectoryRefId>WebSiteRoot</DirectoryRefId> 
       <PreprocessorVariable>var.RootDir</PreprocessorVariable> 
       <SuppressCom>false</SuppressCom> 
       <SuppressRegistry>false</SuppressRegistry> 
       <SuppressRootDirectory>true</SuppressRootDirectory> 
       <KeepEmptyDirectories>true</KeepEmptyDirectories> 
      </HarvestDirectory> 
     </ItemGroup> 
     <HeatDirectory 
      NoLogo="$(HarvestDirectoryNoLogo)" 
      SuppressAllWarnings="$(HarvestDirectorySuppressAllWarnings)" 
      SuppressSpecificWarnings="$(HarvestDirectorySuppressSpecificWarnings)" 
      ToolPath="$(WixToolPath)" 
      TreatWarningsAsErrors="$(HarvestDirectoryTreatWarningsAsErrors)" 
      TreatSpecificWarningsAsErrors="$(HarvestDirectoryTreatSpecificWarningsAsErrors)" 
      VerboseOutput="$(HarvestDirectoryVerboseOutput)" 
      AutogenerateGuids="$(HarvestDirectoryAutogenerateGuids)" 
      GenerateGuidsNow="$(HarvestDirectoryGenerateGuidsNow)" 
      OutputFile="$(IntermediateOutputPath)_%(HarvestDirectory.Filename)_dir.wxs" 
      SuppressFragments="$(HarvestDirectorySuppressFragments)" 
      SuppressUniqueIds="$(HarvestDirectorySuppressUniqueIds)" 
      Transforms="%(HarvestDirectory.Transforms)" 
      Directory="@(HarvestDirectory)" 
      ComponentGroupName="%(HarvestDirectory.ComponentGroupName)" 
      DirectoryRefId="%(HarvestDirectory.DirectoryRefId)" 
      KeepEmptyDirectories="%(HarvestDirectory.KeepEmptyDirectories)" 
      PreprocessorVariable="%(HarvestDirectory.PreprocessorVariable)" 
      SuppressCom="%(HarvestDirectory.SuppressCom)" 
      SuppressRootDirectory="%(HarvestDirectory.SuppressRootDirectory)" 
      SuppressRegistry="%(HarvestDirectory.SuppressRegistry)" /> 
    </Target> 
</Project> 

Я создал этот код на основе документации HeatDirectory Task и я использую его в реальных проектах.

+0

Это то же самое, что и я, и он не работает, потому что задача в пакете NuGet _PublishedApplications, который копирует выходные данные, выполняется после сбора урожая. Он не зависит от ссылки на проект. – Marlos