allowDefinition = 'MachineToApplication' ошибка msbuild - PullRequest
44 голосов
/ 11 марта 2011

У нас есть ASP.NET MVC с 4-5 различными конфигурациями сборки.Всякий раз, когда мы изменяем конфигурацию сборки, нам нужно удалить папку obj для веб-проекта, так как мы получаем ошибку 'allowDefinition =' MachineToApplication '.Больно, но мы справились, удалив папку в событиях до / после сборки.Теперь мне нужно настроить наш CI для создания пакетов развертывания.Это означает, что я не могу удалить папку obj.Каждый раз, когда я компилирую, например, со следующими параметрами msbuild

/ p: CreatePackageOnPublish = true / p: DeployOnBuild = true

Я получаю сообщение об ошибке:

web.config (123): ошибка ASPCONFIG: Ошибка использовать раздел, зарегистрированный как allowDefinition = 'MachineToApplication' за пределами уровня приложения.Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

Насколько я понимаю, проблема в том, что в проекте несколько файлов .config - в нашем случае,нет.Я мог бы действительно использовать некоторую помощь, чтобы найти объяснение и найти постоянное (не взломанное) исправление.

Редактировать: Этот вопрос помечен как дубликат, но соответствующие ответы и причины (ы) в 2 потоках, явно отличаются друг от друга.Не уверен, что подразумевается под этим тегом - я прочитал этот конкретный пост перед публикацией этого вопроса, поскольку он не ответил на мой вопрос.Есть несколько причин для этого сообщения об ошибке.Это «похоже», но определенно не дубликат!

Ответы [ 12 ]

22 голосов
/ 27 марта 2011

Существует аналогичный вопрос здесь на SO с некоторыми хорошими решениями для этой проблемы.

Проблема заключается в том, что при создании пакета развертывания создается копия файла web.config в подпапке / obj. Это обычно будет очищено, если вы сделаете перестройку или очистку. Однако, если вы создаете пакет развертывания в одной конфигурации (например, Debug), а затем переключаетесь на другую конфигурацию (например, Release), папка obj / Debug не очищается, и файл web.config там вызывает проблемы.

Быстрое решение - очистить все конфигурации и затем выполнить (пере) сборку. В качестве альтернативы вы можете удалить папку / obj в вашем проекте. Чтобы навсегда решить проблему, вы можете либо переместить промежуточный вывод (/ obj) из папки проекта, либо изменить проект, чтобы принудительно очистить все конфигурации при перестроении.

21 голосов
/ 17 ноября 2011

Я тоже удалял папку obj, пока у меня не возник конфликт со скриптом сборки, который требовал этого.Catch-22, я использовал принятый ответ по следующей ссылке SO, чтобы переместить местоположение папки Obj в C:\Temp\BUILD.Вы должны сделать это для каждого файла csproj, но это отличное решение.

Вот ссылка: VisualStudio: Как сохранить папку obj в другом месте

Примечаниечто я использую переменную для имени проекта.R: \ Temp \ Build \ Debug \ $ (MSBuildProjectName)

У меня есть строка выше в разделах отладки и выпуска для всех моих проектов, включая проекты классов.Мой путь сборки - это таран для скорости.См. Этот SO для получения дополнительной информации: Как получить доступ к макропеременным в файле csproj?

12 голосов
/ 02 декабря 2011

Я только что ответил на аналогичный вопрос здесь . Напомним, что я столкнулся с этой проблемой в одном из наших проектов MVC, и это было связано с тем, что для свойства MvcBuildViews в файле проекта установлено значение true. Установка свойства false устранила проблему.

<MvcBuildViews>false</MvcBuildViews>

Я также нашел этот ответ , в котором описывается альтернатива, не требующая выключения вида здания.

2 голосов
/ 05 декабря 2012

Я не знаю, что существует "официальное" исправление, так как оно, похоже, запускается на нескольких моих проектах без причины, которую я могу найти в Visual Studio Premium 2012 (никогда не было в предыдущих версиях VS).

Как обходной путь для автоматизации удаления каталога obj, как говорили другие, аналогично ответу пользователя Casual в этом посте VisualStudio: как сохранить папку obj где-нибудь еще , где, к сожалению, просто перемещение местоположения папки obj не всегда работает.

Вместо этого я добавил несколько команд в разделе «События сборки» в командной строке события перед сборкой:

rd "$(ProjectDir)obj" /S /Q
md "$(ProjectDir)obj"
md "$(ProjectDir)obj\Debug"
md "$(ProjectDir)obj\Release"

Вы можете изменить / добавить / удалить подпапки, чтобы они соответствовали вашим пользовательским конфигурациям сборки, используя строку, где buildConfigName соответствует имени используемой вами конфигурации сборки:

md "$(ProjectDir)obj\buildConfigName"

Надеюсь, это поможет!

1 голос
/ 14 августа 2012

У меня была та же ошибка, но с развернутой страницей .. Потом понял, что часы моего веб-сервера по какой-то причине были возвращены в 2010. установить правильную дату исправить мою проблему

1 голос
/ 17 мая 2012

Очистка раствора (щелкните правой кнопкой мыши Solution in VS, clean), сработало для меня.

1 голос
/ 11 марта 2011

Эта ошибка указывает на то, что вы пытаетесь использовать что-то определенное для приложения на уровне дерева IIS, которое не определено как приложение. Например, если вы попытаетесь выполнить функции уровня приложения в файле web.config в виртуальном каталоге, вы получите эту ошибку. Вам нужно найти путь, по которому вы развертываете, и убедиться, что он определен в IIS как приложение или папка или vdir.

0 голосов
/ 21 октября 2016

Хотя проблема объясняется и решается одним способом в принятом ответе, я хотел показать решение, которое может быть лучше для других случаев.Это решение было включено в некоторые версии VS, но я могу только сказать, что у меня была проблема в VS 2013 Update 5. (См. «Осторожно» ниже, это можно исправить в этой версии, ноне работает только в моем конкретном случае).

Я позаимствовал решение из Ошибка: allowDefinition = 'MachineToApplication' за пределами уровня приложения в Visual Studio Connect.

Решение состоит изв том числе следующие строки для проекта веб-приложения (.csproj файл), который обрабатывает удаление промежуточных файлов с ошибками (что не является решением для принятого ответа, поскольку ему нужны эти промежуточные файлы):

<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level, 
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
    <ItemGroup>
     <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
    </ItemGroup>
    <!--Force msbuild to expand all the wildcard characters so to get real file paths-->
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
     <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
    </CreateItem>
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>

Осторожно: по какой-то причине, возможно, потому что я сам включил его в проект, моя цель сборки для построения представлений называлась "BuildViews", а не "MvcBuildViews", поэтому мне пришлось изменитьBeforeTargets атрибут соответственно.

0 голосов
/ 25 мая 2016

У меня несколько похожая проблема, у меня была основная конфигурация как Копировать всегда , поэтому она скопировала конфигурацию в каталог bin.Когда я переиздал основной проект, я получил ошибку MachineToApplication.Поэтому я решил просто изменить конфигурацию на Не копировать и удалить дополнительную конфигурацию из папки bin.

0 голосов
/ 20 февраля 2013

Очистите ваш проект. Удалите папку / obj (возможно, используя publish and deploy? - в ней есть ошибка)

...