2013-11-27 6 views
0

Обновление 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% ».

ответ

1

Пытаться использовать все заглавные буквы DATE, как это:

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

UPDATE: Моя первоначальная догадка неверно - переменные окружения не учитывают регистр, если это делается так.

Похоже, что это зависит от типа переменной окружения. Существуют стандартные переменные среды, такие как %TEMP%, %windir% и т. Д. Это «статические», что означает, что значение не рассчитывается каждый раз, когда вы ссылаетесь на него.

Существуют динамические переменные среды, которые вычисляются каждый раз, когда на них ссылаются. К ним относятся %DATE%, %TIME% и т. Д. Кажется, что препроцессор WiX не может работать с динамическими переменными. Вы можете это проверить: поставьте $(env.windir), и он будет работать, положите $(env.time) - и это не будет. Более подробную информацию об переменных окружения можно найти here.

Я не проверял, есть ли желание в базе данных ошибок WiX для поддержки этого. Не стесняйтесь делать это сами.

Итак, вернемся к вашему вопросу.Вы можете обойти это ограничение следующим образом:

  • Создать расширение препроцессора
  • Reference значение из этого расширения вместо адресации переменной окружения 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

+0

Я пробовал «Дату» во всех случаях, к сожалению, ошибка остается прежней: CNDL0150. Версия WiX - 3.8.1125.0. – Hannes

+0

Эта ошибка, о которой вы говорили, указывает на '$ (env.date)' как неопределенную переменную препроцессора? Во всяком случае, это звучит как проблема с этой конкретной сборкой WiX - вы можете попробовать ее на стабильной версии 3.7. –

+0

Да, да. Имя файла и номер строки верны. Я попробовал это с последней версией 3.7, как вы предполагали, - тот же результат: C: \ test \ WixProjects \ _Global \ Global_Product.wxs (56,0): ошибка CNDL0150: неопределенная переменная препроцессора '$ (env.DATE)' , – Hannes

0

Чтобы установить значение свойства из другого использования имущества следующий синтаксис:

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

Я не думаю, что это ответ на первоначальный вопрос –

+0

Правильно, я путал дату сборки с установочным. Виноват. – Somedust

4

Вы можете добавить свойство в вас WIX проекта (.wixproj) в вашем первая группа свойств, например (можно форматировать дату и/или время по своему вкусу):

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

Тогда в ваших собственных конфигурациях ти групп добавить это свойство в <DefineConstants>, если у вас есть несколько констант, то разделяйте их точкой с запятой ;:

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

Наконец добавьте MSI Property:

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

Это должен быть принятый ответ. Благодаря! – korbes

Смежные вопросы