Изменение WMAppManifest.xml на основе конфигурации сборки - PullRequest
11 голосов
/ 02 декабря 2010

Я бы хотел выпустить разные версии своего приложения и указать это в названии приложения, отображаемом на телефоне. Насколько мне известно, для Silverlight Phone Apps название определяется исключительно WMAppManifest.xml. Поэтому я хотел бы изменить заголовок приложения во время сборки на основе моей конфигурации сборки. Есть предложения?

Ответы [ 3 ]

13 голосов
/ 03 декабря 2010

Вы можете сделать это с небольшим количеством шаблонов T4 и генерацией кода (см. http://msdn.microsoft.com/en-us/library/bb126445.aspx, если вы не знаете об этом.)

Следующие шаги позволят вам использовать другое название приложения, если вы используете конфигурацию отладки или выпуска.

Возьмите копию WMAppManifest.xml и переименуйте ее в WMAppManifest-base.tt

Измените содержание WMAppManifest-base.tt на

<#@ template language="C#" #><#@ output extension=".xml" #><?xml version="1.0"?>
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.0">
  <App xmlns="" ProductID="{4c5315b6-4030-46c5-b5ea-17284d6af0c6}" Title="<#= this.ConfiguredAppTitle #>" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal"  Author="WindowsPhoneApplication8 author" Description="Sample description" Publisher="WindowsPhoneApplication8">
    <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath>
    <Capabilities>
      <Capability Name="ID_CAP_IDENTITY_DEVICE"/>
      <Capability Name="ID_CAP_NETWORKING"/>
    </Capabilities>
    <Tasks>
      <DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>
    </Tasks>
    <Tokens>
      <PrimaryToken TokenID="WindowsPhoneApplication8Token" TaskName="_default">
        <TemplateType5>
          <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI>
          <Count>0</Count>
          <Title><#= this.ConfiguredAppTitle #></Title>
        </TemplateType5>
      </PrimaryToken>
    </Tokens>
  </App>
</Deployment>
<#+ 
    string ConfiguredAppTitle = "MyPhoneApp";
#>

(настроить возможности и т. Д. В зависимости от ситуации.)

В той же папке, что и WMAppManifest-base.tt, создайте файл с именем Debug.WMAppManifest.tt со следующим содержимым:

<#
  ConfiguredAppTitle = "MyDebugApp";
#><#@ include file="WMAppManifest-base.tt" #>

Теперь создайте файл с именем Release.WMAppManifest.tt со следующим содержимым:

<#
  ConfiguredAppTitle = "MyReleaseApp";
#><#@ include file="WMAppManifest-base.tt" #>

Создайте файл с именем copyifnewer.bat в корне проекта. Дайте ему следующее содержание:

echo Comparing: %1 with %2

if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound

fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy

echo Files are not the same.  Copying %1 over %2
copy %1 %2 /y & goto END

:NoCopy
echo Files are the same.  Did nothing
goto END

:File1NotFound
echo %1 not found.
goto END

:File2NotFound
copy %1 %2 /y
goto END

:END

В свойствах проекта добавьте команду PRE-build:

"$(ProjectDir)\copyifnewer.bat" "$(ProjectDir)properties\$(ConfigurationName).WMAppManifest.xml" "$(ProjectDir)properties\WMAppManifest.xml"

Теперь вы можете настроить значения в файлах отладки и выпуска, чтобы изменять заголовки по своему желанию.

Если у вас есть другие конфигурации, просто создайте файлы с соответствующим именем (с тем же содержимым, что и debug.*.tt), и они будут автоматически выбраны.

Обратите внимание, что при тестировании, если вы устанавливаете приложение с одним именем (в эмуляторе или на телефоне), вам придется удалить его, чтобы увидеть изменение имени, отраженное в списке приложений.

Примечание для себя: необходимо написать об этом в блоге. (Это действительно мощный, но трудно понять, как это сделать в первый раз.)

4 голосов
/ 03 ноября 2011

Вы можете использовать шаг предварительной сборки (Свойства проекта -> События сборки -> Командная строка события предварительной сборки) в свойствах проекта с условными командными строками для достижения этого.

Наличие файлов для каждой версии, а затем копирование по умолчанию, чтобы заменить данные там. Вы также можете настроить свои иконки для использования этой же системы! :)

if $(ConfigurationName) == Phone_Free_Debug (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Free.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Free.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Free.png $(ProjectDir)200x200icon.png
)
if $(ConfigurationName) == Phone_Free_Release  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Free.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Free.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Free.png $(ProjectDir)200x200icon.png
)

if $(ConfigurationName) == Phone_Debug  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Paid.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Paid.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Paid.png $(ProjectDir)200x200icon.png
)
if $(ConfigurationName) == Phone_Release  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Paid.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Paid.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Paid.png $(ProjectDir)200x200icon.png
)
0 голосов
/ 04 апреля 2014

Я знаю, что это старая ветка, но наткнулся на нее, когда я искал что-то похожее, и принятый ответ был для меня точным. Я просто хотел добавить предложение по модификации части командного файла, на случай, если это поможет кому-то еще. Я бы прокомментировал принятый ответ, но пока мне не хватает репутации, поэтому надеюсь, что никто не возражает, чтобы я добавил его в качестве отдельного ответа ..!

Если вы управляете версией своего решения (например, в TFS), ваш WMAppManifest может быть защищен от записи, если вы специально не помните, чтобы проверить его перед сборкой. Если это так, командный файл не сможет перезаписать его, но вы не получите никакого уведомления об этом, и сборка будет продолжена, то есть вы можете не заметить, что он не обновлялся для вашей конфигурации сборки. Чтобы решить эту проблему, добавьте следующее в конец пакетного файла (после: END):

if %errorlevel% neq 0 exit /b %errorlevel%

Если пакетный файл дает сбой, сборка останавливается, предупреждая вас о проблеме.

Кроме того, не создавайте командный файл в Visual Studio! Он будет сохранен в кодировке UTF-8 (я думаю), и вы можете получить ошибки, когда Windows попытается его обработать. Создайте его в блокноте, чтобы сохранить в ASCII. Если вы сохраните его с неправильной кодировкой, и он не запустится, вышеуказанная поправка также поймает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...