allowDefinition = 'MachineToApplication' ошибка при публикации из VS2010 (но только после предыдущей сборки)

103

Я могу запустить приложение Asp.Net MVC 2 без проблем на моем локальном компьютере. Просто запустите / отладите.

Но если я его уже построил, то не могу опубликовать! Придется очистить решение и опубликовать его снова. Я знаю, что это не критично для системы, но это действительно раздражает. «Публикация в один клик» не означает «Чистое решение, а затем публикация в один клик»

Точная ошибка выглядит следующим образом:

Ошибка 11 Использование раздела, зарегистрированного как allowDefinition = 'MachineToApplication' за пределами уровня приложения, является ошибкой. Эта ошибка может быть вызвана тем, что виртуальный каталог не настроен как приложение в IIS.

Я подозреваю, что это как-то связано с Web.Config в папке Views, но тогда почему только после того, как я один раз собрал. Следует отметить, что после публикации приложение работает нормально.

Дэн
источник
1
Если в дочернем каталоге есть дополнительный файл web.config, попробуйте удалить его.
user1154664 05

Ответы:

76

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

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

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

И сделайте эту папку не в папке вашего проекта. Работает для меня. Это не идеальное решение, но пока оно хорошее. Убедитесь, что вы удалили папку пакета (расположенную внутри папки obj \ Debug и / или obj \ Release ) из папки проекта, иначе вы будете продолжать получать ошибку.

FWIW, MS знает об этой ошибке ...

Benpage
источник
1
У Phil haack есть новости по этой проблеме для тех, кто работает с SP1 2010: haacked.com/archive/2011/05/09/…
benpage
3
nb решение, которое Фил предлагает в этом блоге, НЕ РАБОТАЕТ для меня. Вышеупомянутое решение - мое единственное решение.
benpage
9
Я думаю, что удаление папки obj - гораздо более простое решение, и его меньше нужно помнить / поддерживать об изменениях в файле проекта. Похоже, это должен быть главный ответ здесь. (по состоянию на середину 2011 г.)
RyanW
FWIW, эта запись фактически изменяет промежуточный выходной путь для публикации ( \objпуть), а НЕ MvcBuildViews. Разница небольшая, но существенная.
Newmanth
40

Я удалил все из моей папки obj / Debug и исправил эту ошибку. Это позволило мне уйти в

<MvcBuildViews>true</MvcBuildViews>

вариант в моем файле проекта (который пригодится с шаблоном T4MVC T4).

Изменить: этого можно достичь намного проще, просто используя меню «Сборка» -> «Перестроить решение» (потому что на самом деле перестройка очищает папку obj / Debug и затем создает решение).

jimmay5469
источник
26

Я использую этот обходной путь на странице MS Connect для этой ошибки. Он очищает все файлы obj и temp в вашем проекте (все конфигурации) перед запуском AspNetCompiler.

Измените целевой объект MvcBuildViews в файле проекта так, чтобы он зависел от целевых объектов, очищающих файлы упаковки, созданные Visual Studio. Эти цели автоматически включаются в проекты веб-приложений.

Все файлы упаковки будут удаляться каждый раз при выполнении целевого объекта MvcBuildViews.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>
Jrummell
источник
Работает для меня. Я также прокомментировал работу следующей цели: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan 01
Обновление. Обновление инструментов MVC 3 должно исправить это. haacked.com/archive/2011/05/09/…
jrummell
3
Да ... добавление rmdir /S /Q "$(ProjectDir)\obj"в раздел пост-сборки согласно Microsoft Ticket решило проблему!
Лениэль Маккаферри
В 2012 году целевые файлы CleanWebsitesPackageTempDir и CleanWebsitesTransformParametersFiles не существуют, и по-прежнему получают ошибку.
Дэйв
2
@jrummell интересно, я получаю эту ошибку MachineToApplication, когда в моем проекте mvc4 включены представления сборки, я думал, что это как-то связано.
Дэйв
24

Эта проблема возникает, когда в папке obj есть выходные данные веб-проекта (шаблонный файл web.config или временные файлы публикации). Используемый компилятор ASP.NET недостаточно умен, чтобы игнорировать содержимое папки obj, поэтому вместо этого он выдает ошибки.

Другое исправление - уничтожить вывод публикации прямо перед вызовом <AspNetCompiler>. Откройте свой .csproj и измените это:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

к этому:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <ItemGroup>
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
  </ItemGroup>
  <Delete Files="@(ExtraWebConfigs)" />
  <RemoveDir Directories="@(ExtraPackageTmp)" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

Это удалит все web.configs в \ obj, а также все папки PackageTmp в \ obj.

Крис Хайнс
источник
ПЛЮС ОДИН все мои положительные голоса. У меня в objпапке был мусор.
ta.speot.is
Редактор жалуется, что элементы внутри <ItemGroup>недействительны, но игнорируйте это - он все равно работает.
Kjell Rilbe
Тодд Скелтон,
4

Если вы используете веб-публикацию, вы можете установить MvcBuildViews=falseи PrecompileBeforePublish=true, которые предварительно компилируются после копирования во временную папку (непосредственно перед публикацией / пакетом).

ПРИМЕЧАНИЕ. PrecompileBeforePublishПоддерживается только «новым» стеком конвейера веб-публикации (VS2010 SP1 + Azure SDK или VS2012 RTM). Если вы используете VS2010 RTM, вам понадобится один из альтернативных методов.

Ричард Салай
источник
Я не вижу этого решения для построения просмотров. Я намеренно поместил ошибку в свое представление и установил PrecompileBeforePublish = True, и это не привело к сбою сборки. (Я использую VS2012)
Хулла
Это решило проблему для меня, работая над сборкой VSO, где я пытался выполнить предварительную компиляцию с помощью / p: PrecompileBeforePublish = true
Стивен МакДауэлл,
3

Что касается решения от jrummell, настройка:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

Он работает в VS 2010 , но не в VS 2012 . В 2012 году необходимо поставить:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Источник:

VS 2010: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets

VS 2012: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.targets

Павел Горчинский
источник
3

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

Я установил для «MvcBuildViews» значение false в проекте, удалил все папки bin и obj, и я все еще получал ошибку. Я обнаружил, что существует файл «.csproj.user», в котором для «MvcBuildViews» все еще установлено значение «истина».

Я удалил файл ".csproj.user", и все заработало.

Поэтому убедитесь, что при изменении файла csproj вы также изменяете или удаляете файл ".csproj.user".

nootn
источник
1

У меня тоже была эта проблема, поэтому я создал событие предварительной сборки в свойствах проекта, чтобы очистить выходные каталоги ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). В другом проекте я также получал эту ошибку, даже при наличии события очистки. Во втором проекте я компилировал представления, перечисленные в файле проекта:

<MvcBuildViews>true</MvcBuildViews>

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

eppdog
источник
1
Спасибо за это, но я не могу отметить MvcBuildViews как False, поскольку это помогает исправить проблемы перед развертыванием.
Дэн
0

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

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

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

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

<!--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атрибут. Я также упростил цель, удалив PropertyGroupи упростив условие, например:

  <Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
    <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>
JotaBe
источник
0

В моем случае я видел, что когда у меня есть MvcBuildViews и PrecompileDuringPublish как истинные, это было причиной этой проблемы.

Поэтому я удалил PrecompileDuringPublish, и это решение сработало для меня, и с тех пор я не сталкивался с этой проблемой.

введите описание изображения здесь

MoXplod
источник