我正在尝试与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。
<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)" />
<!-- Fix Web Service For Live -->
<Target Name="FixFilePathsForLiveDeployment">
<CallTarget Targets="AlterMsiFileNamesLive" />
</Target>
<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.
我没有得到它出错的地方。
任何帮助也非常感谢,如果不清楚我会尝试添加更多笔记,请告诉我。
答案 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>
我知道我搞得一团糟但用简单的话来解释整个项目并不容易。