Не удалось найти часть пути... bin\roslyn\csc.exe
Я пытаюсь запустить проект Asp.net MVC, полученный из системы контроля версий TFS. Я добавил все ссылки на сборки и смог успешно собрать и скомпилировать без каких-либо ошибок или предупреждений.
Но я получаю следующую ошибку в браузере:
Не удалось найти часть пути 'C:\B8akWorkspace\B8akProject\B8akSolution\B8AK.Portal\bin\roslyn\csc.exe'.
Вот полный скриншот страницы ошибки.
После нескольких дней исследований я понял, что Roslyn - это платформа компилятора.Net, которая предлагает расширенные возможности компиляции. Однако я не понимаю, почему моя сборка пытается найти \ bin \ roslyn \ csc.exe, потому что я не настроил ничего, связанного с Roslyn, и не собираюсь использовать Roslyn в своем проекте.
61 ответ
Проблема с шаблонами VS2015 по умолчанию заключается в том, что компилятор фактически не копируется в каталог tfr\bin\roslyn\, а скорее в каталог {outdir}\roslyn\
Добавьте этот код в ваш файл.csproj:
<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
<ItemGroup>
<RoslynFiles Include="$(CscToolPath)\*" />
</ItemGroup>
<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>
В моем случае решение было переустановить / обновить пакеты Nuget:
- Microsoft.Net.Compilers 1.1.1
- Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.1
Затем я посмотрел в.csproj и убедился, что пути к пакетам верны (в моем случае..\..\packages\*.*) Внутри тегов. <ImportProject>
сверху и внутри <Target>
с именем "EnsureNuGetPackageBuildImports" внизу. Это на MVC 5 и.NET Framework 4.5.2.
Краткий ответ - запустите это в консоли диспетчера пакетов:
Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r
Чистый и ремонт работал для меня!
Редактировать: комментаторы говорят, что чистый шаг не является необходимым. Вы можете просто восстановить.
Ваш билд пытается найти \bin\roslyn\csc.exe
потому что следующие пакеты были добавлены в ваш проект. Просто проверьте вас packages.config
файл, вы можете иметь их обоих там
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Microsoft.Net.Compilers
Что такое Roslyn и кто добавил их (пакеты) в проект: Если вы используете.net Framework 4.5.2 для создания проектов с использованием VS2015, вы могли заметить, что шаблоны проектов используют Roslyn по умолчанию. На самом деле Roslyn является одним из компиляторов с открытым исходным кодом для языков.NET от Microsoft.
Почему мы должны удалить Roslyn: Если ваш проект имеет ссылки на Roslyn, и вы заинтересованы в его развертывании без сервера, вы получите нежелательные ошибки на сайте, так как многие хостинг-провайдеры все еще не обновили свои серверы и, следовательно, не поддерживают Roslyn. вопрос, вам нужно будет удалить компилятор Roslyn из шаблона проекта.
Если вы не заинтересованы в использовании Roslyn,следуйте инструкциям ниже, чтобы удалить его
1. Удалите пакеты Nuget, используйте следующие команды из консоли пакетов Nuget
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
2. После этого ваш файл web.config должен быть автоматически обновлен. Если это не так, найдите приведенный ниже код в файле web.config и, если он найден, удалите этот фрагмент кода.
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701"></compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"></compiler>
</compilers>
</system.codedom>
Слишком поздно для ответа, но все же публикация сообщений, если это кому-то поможет.
Следуя приведенным ниже инструкциям, я исправил ошибку:
- удалить папку пакетов
- открыть VS
- перестроить
- обратите внимание, что пакеты NuGet восстанавливаются, но bin\roslyn не создается
- выгрузить проект
- перезагрузить проект
- перестроить
- обратите внимание, что bin\roslyn был создан.
Как уже отмечалось в /questions/7022070/ne-udalos-najti-chast-puti-binroslyncscexe, быстрое исправление заключается в использовании диспетчера пакетов,
Tools
> Nuget Package Manager
> Package Manager Console
, бежать
Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r
Но альтернативное решение (которое автоматически и незаметно воссоздает ваши пакеты, если они отсутствуют) - удалить атрибут вашего проекта. Web.config
файл.
(Web.config
находится в том же каталоге, что и ваш .csproj
файл.)
Открыть Web.config
файл в текстовом редакторе (или внутри Visual Studio).
- В тегеconfiguration
> system.codedom
> compilers
> compiler language="c#;cs;csharp"
, полностью удалите type
атрибут.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- ... -->
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/>
</compilers>
</system.codedom>
</configuration>
Короче говоря, удалите строку, начинающуюся с type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft
.
(Предположительно, одно и то же исправление работает как для Visual Basic, так и для Csharp, но я его не пробовал.)
Об остальном позаботится Visual Studio. Больше не надоServer Error in '/' Application
.
В примере кода, который я предоставил в zip-файле выше, вы теперь получите HTTP Error 403
когда вы нажимаете Ctrl+F5.
Попробуйте заменить http://localhost:64195
в вашем веб-браузере с http://localhost:64195/api/products
.
Теперь веб-API отображается так, как должно:
В качестве провокации я попытался удалить все package
каталог моего решения Visual Studio.
Он был автоматически и незаметно воссоздан, как только я (пере) построил его.
И последнее, но не менее важное: вот код, который воспроизводит ошибку: http://schulze.000webhostapp.com/vs/SrvrErr-reproduce.zip (первоначально из https://github.com/aspnet/AspNetDocs/tree/master/aspnet/web-api/overview/advanced/calling-a-web-api-from-a-net-client/sample/server/ProductsApp)
Вот более MSBuild способ сделать это.
<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" Condition="!$(Disable_CopyWebApplication) And '$(OutDir)' != '$(OutputPath)'">
<ItemGroup>
<RoslynFiles Include="$(CscToolPath)\*" />
</ItemGroup>
<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>
Но я заметил, что файлы roslyn также находятся в моей папке bin (не в папке). Приложение, кажется, работает, хотя.
Как отмечалось в проблеме в проекте Roslyn на GitHub, решение (которое сработало для меня) заключается в простой выгрузке и перезагрузке проекта в Visual Studio.
Папка "bin\roslyn" не создавалась при сборке или перестройке, пока я не перезагрузил проект.
Я следовал за этими шагами, и это работало отлично
- Удалить все папки bin и obj
- Чистое решение и восстановление
- Запустите эту команду в powershell
Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -r
У меня также была такая же проблема при запуске проекта. Вот шаги, которые я следовал.
- Щелкните правой кнопкой мыши в решении
- выберите Чистый раствор
- После того, как очистка удалась, снова построить свой проект
Запустите проект снова
На этот раз я не вижу ту же ошибку. Это работает как ожидалось
- Чистый раствор
- Перестройте решение, эти два шага сработали для меня.
Попробовав все исправления без сигары, я исправил это, обновив этот пакет Nuget в Visual Studios:
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
Мой был с 1.0.0 до 2.0.0 для справки (ошибка больше не показывает)
Вам нужно установить Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix, специально созданный для этой ошибки
- Щелкните правой кнопкой мыши по своему проекту и выберите "Управление пакетами Nuget".
- Найти "Microsoft.CodeDom.Providers.DotNetCompilerPlatform"
- Просто обновите до более старой или более новой версии (неважно, какую), а затем снова обновите до исходной версии.
Это переустанавливает все зависимости и файлы пакета (например, csc.exe)
Для VS 2019 полностью удалите следующий узел:
<system.codedom>
</system.codedom>
В моем случае, прежде чем пробовать какое-либо другое решение, я переключился на конфигурацию "Release", перестроил (папка была создана), а затем снова переключился на "Debug", при этом папка осталась нетронутой.
Это была проверка из системы управления версиями более старого решения, и, по-видимому, исходное (автоматическое) восстановление пакета и сборка проекта не создавали эту папку в каталоге bin.
Обратите внимание, что на момент написания этого обвиняемый компонент достиг версии 2.
Обновление пакетов nuget помогло мне. Щелкните правой кнопкой мыши решение> Управление пакетами NuGet для решения и обновите все пакеты, в частности:Microsoft.Net.Compilers и Microsoft.CodeDom.Providers.DotNetCompilerPlatform.
Это известная проблема с https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform 1.0.6. Понижение до 1.0.5 исправило это для меня.
Таким образом, ответ Роба Кэннона по существу сработал для меня, но мне пришлось настроить несколько вариантов. В частности, мне пришлось удалить условие на цели, а также изменить атрибут Include, так как $CscToolPath был пуст при создании проекта на нашем сервере сборки. Любопытно, что $CscToolPath не был пустым при локальном запуске.
<Target Name="CopyRoslynFiles" AfterTargets="AfterBuild" >
<ItemGroup>
<RoslynFiles Include="$(SolutionDir)packages\Microsoft.Net.Compilers.1.1.1\tools\*" />
</ItemGroup>
<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>
В моем случае у меня была проблема в Jenkins, когда он пытался развернуть его в Octopus со следующей ошибкой:
MSBUILD : OctoPack error OCT-1676060969: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: System.Exception: Failed to build the path for '\bin\roslyn\csc.exe' relative to 'T:\workspace\machine.engine\Machine.engine.Test': Invalid URI: The format of the URI could not be determined.. See the inner exception for more details. ---> System.UriFormatException: Invalid URI: The format of the URI could not be determined. [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at System.Uri..ctor(String uriString) [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 211 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: --- End of inner exception stack trace --- [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at OctoPack.Tasks.Util.OctopusPhysicalFileSystem.GetPathRelativeTo(String fullPath, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\Util\OctopusPhysicalFileSystem.cs:line 224 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at OctoPack.Tasks.CreateOctoPackPackage.AddFiles(XContainer nuSpec, IEnumerable`1 sourceFiles, String sourceBaseDirectory, String targetDirectory, String relativeTo) in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 443 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
MSBUILD : OctoPack error OCT-1676060969: at OctoPack.Tasks.CreateOctoPackPackage.Execute() in Z:\buildAgent\workDir\20ba9f2e0d5e4022\source\OctoPack.Tasks\CreateOctoPackPackage.cs:line 190 [T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj]
Done Building Project "T:\workspace\machine.engine\Machine.engine.Test\Machine.engine.Test.csproj" (default targets) -- FAILED
причина
Потратив некоторое время, я использовал внутренний разработанный компонент, который использовал Microsoft.Net.Compilers
, Причиной использования внутреннего компонента Microsoft.Net.Compilers
Был преодолеть эту проблему ( C#: бросить недопустимую компиляцию выражений) и был решен таким образом ( Как использовать C# 7 с Visual Studio 2015?). Это приводит к тому, что, когда я установил компетентного в основной программе, Microsoft.Net.Compilers
добавить себя автоматически.
Решение
Мой обходной путь заключался в том, чтобы удалить следующее из нашего внутреннего компонента (после ответа @malikKhalil)
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
И выбрал компилятор C# 7 в Jenkins вместо C# 6 и пересобрал, чтобы убедиться, что все работает и собирается правильно.
Затем, наконец, в своей основной программе я попытался обновить свой внутренний компонент. И все, чем строить снова. Он построен без каких-либо проблем или проблем.
За комментарий Даниэля Нила выше:
Версия 1.0.3 пакета Nuget для Microsoft.CodeDom.Providers.DotNetCompilerPlatform работает для меня, но версия 1.0.6 вызывает ошибку в этом вопросе
Понижение до 1.0.3 решило эту проблему для меня.
Обновление Microsoft.CodeDom.Providers.DotNetCompilerPlatform с 1.0.0 до 1.0.1 исправило это для меня.
В моем случае мне просто нужно было перейти в каталог bin в Visual Studio Solution Explorer (проект веб-приложения) и напрямую включить проект roslyn. Щелкнув правой кнопкой мыши по папке и выбрав Включить в проект. И снова проверьте решение, чтобы запустить процесс сборки.
Папка roslyn не была включена по умолчанию.
В моем случае, просто удалив все из папки bin и перекомпилировав, все сделал за меня.
Удачи всем, кто имеет эту проблему.
Если вы добавляете ASPNETCOMPILER для компиляции ваших представлений Razor в MVC, как в этом вопросе Stackru, то измените PhysicalPath, чтобы он размещал место, где находится пакет Nuget Roslyn (обычно указываемый через переменную $CscToolPath):
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(CscToolPath)" />
Откройте файл проекта и удалите все ссылки с помощью команды Импорт проекта ="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0....
Откройте web.config и удалите все атрибуты компиляторов system.codedom
У меня была такая же проблема при установке моего приложения на сервере, когда все работало отлично на локальном хосте.
Ни одно из этих решений не сработало, у меня всегда была одна и та же ошибка:
Could not find a part of the path 'C:\inetpub\wwwroot\myApp\bin\roslyn\csc.exe'
Я закончил тем, что сделал это:
- в моем проекте установки, щелкните правой кнопкой мыши, просмотр> файловая система
- создать
bin/roslyn
папка - выберите добавить> файлы и добавить все файлы из
packages\Microsoft.Net.Compilers.1.3.2\tools
Это решило мою проблему.
Проблема с шаблонами VS2015 по умолчанию заключается в том, что компилятор фактически не копируется в {outdir}_PublishedWebsites\tfr\bin\roslyn\
каталог, а точнее {outdir}\roslyn\
каталог. Это, вероятно, отличается от вашей местной среды, так как AppHarbor
создает приложения с использованием выходного каталога вместо построения решения "на месте".
Чтобы исправить это, добавьте следующее к концу .csproj
файл сразу после блока xml <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">...</Target>
<PropertyGroup>
<PostBuildEvent>
if not exist "$(WebProjectOutputDir)\bin\Roslyn" md "$(WebProjectOutputDir)\bin\Roslyn"
start /MIN xcopy /s /y /R "$(OutDir)roslyn\*.*" "$(WebProjectOutputDir)\bin\Roslyn"
</PostBuildEvent>
</PropertyGroup>
В моем случае, как и в Basim, был пакет NuGet, который сообщал компилятору, что нам нужен C# 6, а мы этого не делали.
Нам пришлось удалить пакет NuGet Microsoft.CodeDom.Providers.DotNetCompilerPlatform
который затем удалил:
<package id="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.0" targetFramework="net452" />
из файла packages.config<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" /> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" /> </compilers> </system.codedom>
в system.codedom
узел, вы можете увидеть, почему он привел в Рослин: compilerOptions="/langversion:6
Удалите папку Bin в обозревателе решений и снова создайте решение. Это решило бы проблему