Как включить фрагменты в Wix? - PullRequest
13 голосов
/ 02 ноября 2011

Я создал wixlib для обмена фрагментами в некоторых проектах wix.
Я могу ссылаться на фрагменты, которые имеют свойство в моем основном файле wix, с помощью PropertyRef, но как я могу ссылаться на фрагменты, где я хочу массовую копию его содержимого ??
Например, у меня есть фрагмент, который проверяет, установлен ли .net Framework, и я хочу включить этот фрагмент в мой основной файл wix в тег проекта ...
Вот фрагмент, расположенный в моем wixlib, который я хочу включить в несколько проектов wix:

  <Fragment Id="fm35">
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="framework 3.5 is not installed">
      <![CDATA[Installed OR NETFRAMEWORK35]]>
    </Condition>
  </Fragment>

Спасибо !!

Ответы [ 2 ]

19 голосов
/ 08 апреля 2014

В старые времена в wix 2 у нас были элементы FragmentRef.Было очень легко включить любой фрагмент в раздел «Продукт», и любому, кто читает xml, было очень легко выяснить, что делается.

<FragmentRef Id="CustomActionFrag" />
<FragmentRef Id="PropertiesFrag" />

Теперь в wix 3 они исключили элемент FragmentRef.Не уверен почему.Я нахожу это очень раздражающим, потому что в моем элементе Product я должен добавить несколько ссылок на «что-то определенное в моих фрагментах»

<CustomActionRef Id="caDoSomething"/>
<PropertyRef Id="PropCryptic"/>

Если я не сделаю этого, фрагмент полностью игнорируется и не создаетего путь в окончательный MSI.

Это очень загадочно для любого, кто читает XML.Верни мне мой FragmentRef!

15 голосов
/ 02 ноября 2011

Это интересный вопрос! В руководстве говорится, что все, что может быть делегировано во фрагмент, имеет вариантный тег : FeatureRef для Feature, PropertyRef для Property и т. Д. Однако содержимое фрагмента в вашем вопросе не выдает никаких ошибок и проект строится нормально.

Я не знаю, намеренно ли это, у самого элемента Fragment нет брата по ссылке FragmentRef. По какой-то причине элемент Fragment имеет необязательный атрибут Id, но он указан для опытных пользователей, чтобы помечать разделы. Я не знаю, что это значит ...

Но, похоже, вы можете обмануть здесь. :-) Добавьте поддельный элемент ComponentGroup в ваш фрагмент, который не содержит реальных компонентов:

  <Fragment>
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="framework 3.5 is not installed">
      <![CDATA[Installed OR NETFRAMEWORK35]]>
    </Condition>
    <ComponentGroup Id="Fake" />
  </Fragment>

Теперь вы можете ссылаться на эту ComponentGroup в вашем основном Product.wxs, и содержимое всего фрагмента будет включено, как обещано в руководстве:

   <Feature Id="ProductFeature" Title="My product feature" Level="1">
      <ComponentRef Id="ProductComponent" />
      <ComponentGroupRef Id="Fake"/>
   </Feature>

Пока ComponentGroup не имеет никакого значения для самого MSI, он не приносит мусора в пакет MSI. Но это, конечно, загрязняет исходный код ...

...