0

我创建了一个自定义任务来获取我在 MSBuild 中构建的程序集的三部分版本号。

<Target Name="GetVersion">为此创建了一个自定义,它运行良好 - 由三部分组成的版本号 ( 1.5.2) 存储ThreePartBuildNumber在 MSBuild 中的一个属性中。

但是,我如何告诉 Visual Studio 2010 中的 MSBuild 在编译我的程序集后以及在创建我的 WiX 安装项目之前调用这个目标(我想在其中Product/@Version自动将 WiX 安装脚本设置为这个由三部分组成的版本号)?

如何将这个新目标“插入”到通常的 VS 2010 构建过程中?

更新:

好的,我已经设法将它放入*.wixproj文件中,这也是一个 MSBuild 文件,真的。在 中<Target Name="BeforeBuild">,我可以成功确定由三部分组成的版本号,它存储在名为ThreePartVersionNumber.

但是,我现在如何才能在我的 WiX 设置中访问这个正确填充的 MSBuild 属性呢?我尝试设置<Product Version="$(var.ThreePartVersionNumber) ...>,但这不起作用 - 它似乎没有找到变量....也不适用于sys.orenv.前缀......

那么如何使这个具有我需要的信息的 MSBuild 属性对 WiX 安装程序脚本/XML“可见”?!?!?!?我似乎看不到所有这些尖括号的森林.....

4

2 回答 2

1

使用 /verbosity:d 开关可以全面了解所有已执行的目标及其被调用的粗略原因(依赖于)。确定您想成为之前或之后或依赖的确切事物。除了在 Target 上使用依赖属性外,还有各种属性用于收集用于各种目的的依赖关系。您可以使用 /preprocess 来识别这些,然后查找上一步中引起您注意的目标。

我发现特定的答案通常不起作用,因为构建情况因我的语言或确切的包含顺序很重要或其他次要问题而有所不同;所以这就是我在我的案例中找到真正触发因素的方式。

于 2014-09-16T06:41:56.177 回答
0

我最后做了什么:

在我的 WiX 设置项目中,在myproject.wixprojMSBuild 文件中,我添加了一个新的自定义任务,如下所示:

<UsingTask TaskName="GetThreePartVersion" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <AssemblyPath ParameterType="System.String" Required="true" />
        <ThreePartVersion ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System.Diagnostics" />
        <Code Type="Fragment" Language="cs">
           <![CDATA[
             Log.LogMessage("Getting version details of assembly at: " + this.AssemblyPath, MessageImportance.High);
             Version v = Version.Parse(FileVersionInfo.GetVersionInfo(this.AssemblyPath).FileVersion);
             this.ThreePartVersion = v.ToString(3);
           ]]>
        </Code>
    </Task>
</UsingTask>

然后在BeforeBuild目标中,我添加了这些行来调用此任务并使用结果定义一个 WiX 常量:

<Target Name="BeforeBuild">
    <GetThreePartVersion AssemblyPath="$(SolutionDir)Plugin\$(OutputPath)Swisscom.Vidia.Plugin.dll">
        <Output TaskParameter="ThreePartVersion" PropertyName="ThreePartVersionNumber" />
    </GetThreePartVersion>
    <PropertyGroup>
        <DefineConstants>ThreePartBuildVersion=$(ThreePartVersionNumber)</DefineConstants>
    </PropertyGroup>
    <Message Text="Three-part version: $(ThreePartVersionNumber)" />
</Target>

现在在我的 WiXproject.wxs文件中,我可以引用已定义的常量,并将其用于<Product Version="..." ... />属性:

<Product Id="*" Name="MyProject" Language="1033" 
         Version="$(var.ThreePartBuildVersion)" ......>

在我最终做对之前,我花了一些时间和大量的试验和错误,但这就是它现在对我有用的方式。希望有一天这可能会帮助其他人......

于 2014-09-16T09:10:03.350 回答