0

У меня есть группа из .cs файлов, которые представляют собой тестовые примеры для определенных манипуляций с использованием API Roslyn. Поскольку они должны иметь действительный синтаксис компиляции, я хотел бы иметь Intellisense, Resharper и другие проверки времени перед компиляцией, доступные для этих файлов при записи в них, но не для их компиляции при построении решения (поскольку тест будет смотреть только на синтаксис).Добавить синтаксическую проверку (Intellisens, Resharper и т. Д.) В файл .cs без их компиляции

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

Сначала я думал, что могу просто исключить каталог из компиляции в .csproj, но я не нашел такого свойства, которое бы это разрешило. Я слышал, что <CompileDependsOn> потенциально может помочь мне здесь, но я точно не понимаю.

Мой прямой вопрос: возможно ли иметь синтаксическую проверку (Intellisense, Resharper и т. Д.) Для файлов, которые не будут компилироваться при построении проекта/решения, без необходимости их в отдельном незастроечном проект?

+0

Я попытался просто изменить «Build Action» в свойствах файла .cs из «Скомпилировать» на что-то еще, и я все еще получаю синтаксическую раскраску, действия ReSharper и т. Д. –

+0

Да, вы по-прежнему получаете раскраску на основе простых интерпретация синтаксиса (имена классов как голубые, операторы как синие и т. д.), но вы не получаете фактическую проверку типа или автозаполнение intellisense, которые вы ожидаете в скомпилированном файле.Например, исключение точки с запятой в конце инструкции или забывание о правильном закрытии оператора if с помощью скобки будет отображаться как ошибка, но использование несуществующего или недоступного метода в контексте класса не будет. Попробуйте закрыть и снова открыть файл после перехода на контент, если вы не видите, что я имею в виду. –

ответ

1

Я могу придумать хотя бы пару потенциальных решений.

Одним из решений может быть использование определения препроцессора. Это решение может быть неудовлетворительным, если директивы мешают вашим тестам, но если вы хотите попробовать, файл .cs может выглядеть следующим образом:

#if TESTFILE 
namespace ClassesNotToCompile 
{ 
    public class IndividualClassNotToCompile 
    { 
     ... 
    } 
} 
#endif 

Затем нужно будет определить символ TESTFILE в конфигурации сборки для ваш проект. Тогда просто не используйте эту конфигурацию сборки. Возможно, вам придется выбрать эту конфигурацию в среде IDE, чтобы получить подсветку синтаксиса.

Другим было бы отредактировать файл .csproj, как вы и предполагали. Предполагая, что .NET 3.5 или новее, есть атрибут элемента с именем Remove, который может использоваться, когда ItemGroup находится внутри Target. Вы можете использовать этот атрибут в BeforeBuild цели, чтобы удалить файлы из Compile пункта:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    ... 
    <ItemGroup> 
    <Compile Include="CompileMe.cs" /> 
    <Compile Include="NonCompiling\DoNotCompileMe.cs" /> 
    <Compile Include="Properties\AssemblyInfo.cs" /> 
    </ItemGroup> 
    ... 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <Target Name="BeforeBuild"> 
    <ItemGroup> 
     <Compile Remove="NonCompiling\*" /> 
     <Content Include="NonCompiling\*"> 
     <CopyToOutputDirectory>Always</CopyToOutputDirectory> 
     </Content> 
    </ItemGroup> 
    </Target> 
    ... 
</Project> 

Это важно для BeforeBuild определении цели появляться после Import из Microsoft.CSharp.targets. В противном случае ваша настраиваемая цель BeforeBuild не будет переопределять значение по умолчанию, пустая BeforeBuild цель из импорта.

+0

Второе решение работало как шарм, спасибо! Мне только пришлось немного его модифицировать и включить инструкцию '', которая скопировала тестовые файлы в выходной каталог, так как удаление их с помощью вашего решения привело к тому, что они не перемещали их при компиляции, даже если они установлены в' CopyAlways'. –

+1

@PhilGref Я забыл, что вам нужен выход в сборке. Это также легко сделать без элемента ''. Я уточню свой ответ. – Andrew

1

Он был бы похож на этот https://stackoverflow.com/questions/29242600/compile-your-application-with-outer-documents, за исключением того, что вместо изменения действия сборки на «Встроенный ресурс» измените его на «Нет». Не на 100% уверены в этом, так как, когда я это пробовал, он исключил файл из компиляции, но весь текст изменил цвета, но, похоже, там все еще было похоже на intellisense. Все варианты перепрошивки все еще, похоже, тоже есть.