Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы можете сделать это с небольшим количеством шаблонов 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), и они будут автоматически подняты.

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

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

Ответ 2

Для достижения этой цели вы можете использовать шаг предварительной сборки (Project Properties → Build Events → Pre-Build event command line) в свойствах проекта с условными командами.

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

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
)

Ответ 3

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

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

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

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

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