Build正在挑选错误的文件名

时间:2014-02-18 09:51:52

标签: build wix teamcity build-process msbuild-task

我正在尝试与Team city持续集成并尝试更新我的构建。

该怎么办?

按此顺序构建假设在文件夹(VWriter_1.9.1.46903_Live.msi),Local(VWriter_Local.msi),Test(VWriter_Test.msi)和UAT(VWriter_UAT.msi)中创建4个文件夹和msi构建。 ,这在我当地很好,我期待在现场。

它在做什么。

在团队城市中实时检查构建时,它的行为很奇怪,它只创建了4次VWriter_UAT.msi。

我的build.xml代码:

<CallTarget Targets="PreBuildDeploymentEvent" />

<CallTarget Targets="BuildUATVoteWriterDeploymentProject" />

<CallTarget Targets="BuildVoteWriterDeploymentProject" />

<CallTarget Targets="BuildLocalDevelopmentVoteWriterDeploymentProject" />

<CallTarget Targets="BuildTestVoteWriterDeploymentProject" />

目标:

<CallTarget Targets="FixFilePathsForLiveDeployment" />

<MSBuild Projects="..\src\Deployment\VoteWriterInstaller.wixproj" Properties="Configuration=Release;OutDir=$(MSBuildProjectDirectory)\Live Release\;" Targets="Clean;Build;"/>

<ItemGroup>
  <DeleteAfterBuild Include="$(MSBuildProjectDirectory)\Live Release\*.*" Exclude="$(MSBuildProjectDirectory)\Live Release\*.msi"  />
</ItemGroup>
<Delete Files="@(DeleteAfterBuild)" />

FixFilePathsForLiveDeployment:

  <!-- Fix Web Service For Live -->

 <Target Name="FixFilePathsForLiveDeployment">

 <CallTarget Targets="AlterMsiFileNamesLive" />

  </Target>

AlterMsiFileNamesLive:

  <Target Name="AlterMsiFileNamesLive">

<ItemGroup>
  <WixProject Include="Item">
    <Path>..\src\Deployment\VoteWriterInstaller.wixproj</Path>
  </WixProject>
</ItemGroup>

 <FileUpdate Files="%(WixProject.Path)" 
      Regex="(\x3COutputName>.+?)(?:_.+?)??(\x3C/OutputName>)"

      **ReplacementText="${1}_$(Version)_Live${2}" />**
      // This is not creating as Live this is picking UAT file extension name. 

我没有得到它出错的地方。

任何帮助也非常感谢,如果不清楚我会尝试添加更多笔记,请告诉我。

1 个答案:

答案 0 :(得分:1)

我不是MSbuild的专家,因此我发现你的细节非常混乱。但是,我自己有几个Wix项目,它们在使用MSbuild时构建在自定义文件夹中。

我相信你的问题存在于路径的某个地方,它们无法正确解决。

我的解决方案是创建一些通用路径属性,以便无论我在哪里构建文件夹结构都相同。 我不知道你的源文件夹结构,但我想如果你想这样,你可以自己调整它们。 例如:

  <PropertyGroup>
      <RootDir>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)\..\..'))\</RootDir>
      <WorkingFolder>$(RootDir)src\</WorkingFolder>
      <OutDir>$(RootDir)MSI\</OutDir>
      <OutputPath>$(OutDir)</OutputPath>
  </PropertyGroup>

因此RootDir属性将设置分支根目录(src)的路径,然后从该RootDir创建每个其他路径,以便它们在正在构建的任何计算机上保持一致。

然后我将所有想要传递给wixproj的Wix属性放在一个msbuild属性中:

  <PropertyGroup>
    <WixProperties>
      WixToolPath=$(WixToolPath);
      WixTargetsPath=$(WixTargetsPath);
      WixTasksPath=$(WixTasksPath);
      DefineSolutionProperties=false;
      OutputPath=$(OutputPath);
      WorkingFolder=$(WorkingFolder);
      SuppressBuildInfo=true;
    </WixProperties>
  </PropertyGroup>

然后最后是Build target:

  <Target Name="BuildMSI">
    <MSBuild Projects="$(WorkingFolder)WixMsi\$(MSIPackageName).wixproj"
             Properties="$(WixProperties)"
             Targets="Rebuild" />
  </Target>

我的解决方案比这里的示例要大得多,其中涉及一个常见的Msbuild Installation.proj,它具有所有这些属性和目标,然后对于每个Wix项目,另一个projectX.proj具有<Import Project="Installation.proj"/>

注意BuildMSI目标中的属性MSIPackageName,因为我有每个Wix项目的proj文件,我在那些proj文件中定义了该属性,而这些属性又被传递给主installation.proj

这样,每个wix都可以有不同的输出文件夹。您只需将第一个属性组中的OutDir属性调整为此类<OutDir>$(RootDir)MSI\$(MSIPackageName)</OutDir>,或者进一步开发它并在每个projectx.proj

中定义它们

最后,如果您只想运行一个.proj,请创建一个调用每个项目的主proj文件。

  <Target Name="BuildMSIProjects">
    <ItemGroup>
      <WixProjectFiles Include="WixMsi\projectX.proj" />
      <WixProjectFiles Include="WixMsi\projectY.proj" />
      <WixProjectFiles Include="WixMsi\projectZ.proj" />
    </ItemGroup>
    <MSBuild Projects="@(WixProjectFiles)"/>
  </Target>

我知道我搞得一团糟但用简单的话来解释整个项目并不容易。