Добавление дополнительных папок содержимого в пакет Azure
Я использую Azure SDK 2.5 У меня есть веб-роль в проекте облачного сервиса. Я хотел бы добавить папку таким образом, чтобы она была развернута в родительском каталоге приложения. Я не нашел способ сделать это, что заставляет меня задуматься, зачем использовать возможность определять виртуальные каталоги в csdef.
Поэтому я решил попробовать добавить папки через конфигурацию Contents/Content xml в csdef. Я либо в корне неправильно понимаю, что делает этот бит конфигурации, либо он безнадежно сломан.
Предполагая эту структуру папок
/
/CloudService
/SomeOtherContent
Если я определю следующее:
<Contents>
<Content destination="frontend">
<SourceDirectory path="..\SomeOtherContent" />
</Content>
</Contents>
и построить я получаю:
ошибка CloudServices089: не удается найти исходный каталог 'C:\src\template\src\Template.CloudService\bin\Debug\..\SomeOtherContent'
Итак, он запускает bin \ Debug, так что я просто сделаю это..\..\..\SomeOtherContent
ошибка CloudServices089: не удается найти исходный каталог 'C:\src\template\src\Template.CloudService\..\..\..\SomeOtherContent'
Да, верно, папка, в которой разрешен мой относительный путь, изменилась!!! Его больше нет, bin\Debug. Wtf!? Как это можно сделать, чтобы работать? Это работает, если я ввожу полный путь с указанием полного пути.
1 ответ
Поэтому я решил эту проблему, установив MSBuild для определения пути и вставив его в переменную окружения, которую я назвал FrontendDir.
<Contents>
<Content destination="frontend">
<SourceDirectory path="%FrontendDir%" />
</Content>
</Contents>
и в ccproj я добавил:
<UsingTask
TaskName="SetEnvironmentVariableTask"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll">
<ParameterGroup>
<Name ParameterType="System.String" Required="true" />
<Value ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Code Type="Fragment" Language="cs">
<![CDATA[
Environment.SetEnvironmentVariable(Name, Value);
]]>
</Code>
</Task>
</UsingTask>
<Target Name="BeforeBuild" Condition=" '$(FrontendDir)' == '' ">
<Message Text="Setting Project Dir" Importance="high" />
<SetEnvironmentVariableTask Name="FrontendDir" Value="$(ProjectDir)\..\Template.FrontEnd\dist" />
</Target>
Здесь желательно поместить весь путь в переменную env, так как вы можете легко переопределить его в различных сценариях сборки, переопределив значение (например, /p:FrontendDir="c:\foo")
Так что это работает и работает довольно хорошо. Я все еще говорю, что поведение, которое я видел раньше с относительным разрешением пути, меняющим папки... не работает Это просто не работает с относительными путями в любом удобном для использования виде.
Вы видите ту же ошибку, но из разных целей msbuild.
Первая ошибка (при использовании ..\..\
) брошен в PreValidateServiceModel
который проходит в расположении источника и проверяет путь
ServiceDefinitionFile="@(SourceServiceDefinition)"
ServiceConfigurationFile="@(SourceServiceConfiguration)"
C:\src\Azure\ServiceDefinition.csdef: ошибка CloudServices089: Не удается найти исходный каталог 'C:\src\Azure\..\..\.. \ Installers\' в роли WebHost. [C:\ SRC \Azure\Azure.ccproj]
Завершено создание цели "PreValidateServiceModel" в проекте "Azure.ccproj" - СБОЙ.
Вторая ошибка брошена в ValidateServiceFiles
который проходит в целевом местоположении
ServiceDefinitionFile="@(TargetServiceDefinition)"
ServiceConfigurationFile="@(TargetServiceConfiguration)">
C:\src\Azure\bin\Release\ServiceDefinition.csdef: ошибка CloudServices089: Не удается найти исходный каталог 'C:\src\Azure\bin\Release\Installers\' в роли WebHost. [C:\ SRC \Azure\Azure.ccproj]
Завершено создание целевого объекта "ValidateServiceFiles" в проекте "Azure.ccproj" - СБОЙ.
Если вы поразмышляете над C:\Program Files\Microsoft SDKs\Azure.NET SDK\v2.9\bin\ServiceDescription.dll, вы можете увидеть ProcessRoleContents
метод, выполняющий проверку, но использующий SourceFile для определения местоположения.
Один из вариантов - убедиться, что целевая папка существует (даже если она пуста) до начала сборки.
Было бы лучше, если бы PreValidation разрешил путь, и когда цель сохранена, у нее был полный путь.
В итоге я отредактировал ccproj и добавил это
<Target Name="BeforeAddRoleContent">
<ItemGroup>
<AzureRoleContent Include="Installers\">
<RoleName>Azure</RoleName>
<Destination></Destination>
</AzureRoleContent>
</ItemGroup>
</Target>
Ссылка на содержимое среды выполнения из.ccproj (Azure SDK 2.9)