如何将安装构建日期写入属性

时间:2013-11-27 09:03:24

标签: wix

更新2 feature request已被拒绝,原因只是因为WiX无法支持cmd.exe提供的这些“假”变量。所以下面接受的答案仍然是最好的解决方案。

更新:我已发出添加预处理器动态环境变量支持的功能请求。一旦开发人员回应,我就会更新这个帖子。


原始问题:

我想在设置属性时编写日期。

<Property Name="BuildDate" Value="$(env.Date)" />

<Property Name="BuildDate" Value="$(sys.Date)" />

时抛出CNDL0150:“未定义的预处理器变量”
<Property Name="BuildDate" Value="[Date]" />

当然会将字符串“[Date]”写入MSI属性。

我怎样才能做到这一点?

编辑:我在所有情况下都试过“日期”,结果相同。此外,添加一个名为“BuildDate”的新环境变量并将其设置为“%DATE%”将删除编译错误,但写入MSI的值不会解析为实际日期,而是产生字符串“%DATE% ”

3 个答案:

答案 0 :(得分:4)

例如,您可以在第一个属性组中添加wix项目(.wixproj)中的属性(您可以根据自己的喜好设置日期和/或时间格式):

<Date>$([System.DateTime]::Now.ToString("yyyyMMddhhmm"))</Date>

然后在您的配置中,属性组在<DefineConstants>中添加此属性,如果您有更多常量,则用分号;分隔它们:

<DefineConstants>Date=$(Date)</DefineConstants>

最后添加MSI属性:

<Property Id="BuildDate" Value="$(var.Date)" />

答案 1 :(得分:1)

尝试使用全部大写DATE,如下所示:

<Property Name="BuildDate" Value="$(env.DATE)" />

UPDATE :我的初步猜测不正确 - 以这种方式引用时,环境变量不区分大小写。

似乎它取决于环境变量的类型。有标准的环境变量,如%TEMP%%windir%等。这些变量是“静态的”,意味着每次引用时都不会计算该值。

有动态环境变量,每次引用时都会计算出来。这些包括%DATE%%TIME%等。似乎WiX预处理器无法使用动态变量。您可以对此进行验证:放置$(env.windir)它会起作用,放置$(env.time) - 但它不会。有关环境变量的更多信息可以在here找到。

我还没有验证WiX错误数据库是否有希望支持这一点。随意自己做。

所以,回到你的问题。您可以通过以下方式解决此限制:

  • 创建预处理器扩展
  • 引用该扩展名中的值,而不是引用环境变量direcly

可以找到如何创建预处理器扩展的示例here

以下是完成工作的代码示例:

   public class DateExtension : PreprocessorExtension
   {
     public override string[] Prefixes
     {
       get
       {
         return new[] { "date" };
       }
     }

     public override string GetVariableValue(string prefix, string name)
     {
       string result = null;

       switch (prefix)
       {
         case "date":
           switch (name)
           {
             case "Now":
               result = DateTime.Now.ToShortDateString();
               break;
           }
           break;
       }

       return result;
     }
   }

在您的WiX代码中,您可以通过以下方式使用它:

<Property Id="BuildDate" Value="$(date.Now)" />

不要忘记:

  • 将预处理程序扩展DLL传递给WiX安装项目(-ext path/to/PreprocessorExtension.dll
  • [assembly: AssemblyDefaultWixExtension(typeof(PreprocessorWixExtension))]添加到预处理器扩展项目

以下是我在MSI包中观察到的结果:

resulting MSI package

答案 2 :(得分:0)

要从其他属性设置属性值,请使用以下语法:

<SetProperty Id="BuildDate" Value="[Date]" After="InstallInitialize" />