Изменение WMAppManifest.xml на основе конфигурации сборки

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

3 ответов


вы можете сделать это с помощью немного шаблонов 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

в свойствах проекта добавьте эту команду предварительной сборки:

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

теперь вы можете отрегулировать значения в файлах debug & release для изменения заголовков по вашему желанию.

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

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

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


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

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

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
)

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

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

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

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

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