ReSharper — включение внешних исходных файлов в проверку кода

#c# #visual-studio-2010 #code-generation #resharper #intellisense

#c# #visual-studio-2010 #генерация кода #перетачиватель #intellisense

Вопрос:

Предыстория:

Мы используем сторонний инструмент в нашем решении .NET C #. Этот инструмент имеет собственный синтаксис и интегрируется с Visual Studio. Когда мы используем этот инструмент, мы пишем его разметку в Visual Studio, а затем, когда мы создаем решение, пользовательский инструмент запускается и генерирует файл .cs на основе написанной нами разметки.

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

Итак, мы исключили сгенерированные CS-файлы из SVN, а затем следующая проблема, с которой мы столкнулись, заключалась в том, что решение Visual Studio ссылалось на эти файлы, поэтому, когда TeamCity (наше программное обеспечение для непрерывной сборки / интеграции) приступило к сборке решения, оно сразу же завершилось неудачей, поскольку не смогло найти эти файлы.

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

Теперь у нас появилась новая проблема — поскольку сгенерированные файлы больше не включены в решение, проверка intellisense и кода завершается неудачей, поскольку сгенерированные классы не могут быть найдены. Решение строится просто отлично (так как снова код повторно генерируется во время сборки).

Вопрос

Есть ли способ сообщить ReSharper о включении сгенерированных файлов .cs в проверку кода? Эти файлы являются внешними по отношению к решению, но они находятся в каталоге obj.

Ваше здоровье,

Тайлер

Комментарии:

1. Не могли бы вы сохранить файлы в решении и добавить шаг предварительной сборки для создания пустого файла .cs, если его нет? Это позволит сохранить сборку счастливой. Я использую аналогичный метод в наших проектах для файлов, содержащих переопределяемые разработчиком строки подключения к БД. У меня есть несколько примеров целей MSBuild, если это поможет.

2. Привет, RichTea, звучит здорово, я бы хотел увидеть ваши образцы, если это возможно?

Ответ №1:

У нас была похожая проблема, и мы не смогли найти хорошего решения, поэтому я написал расширение ReSharper для включения внешнего кода:

https://resharper-plugins.jetbrains.com/packages/ReSharper .Внешний код

Комментарии:

1. Это должно привлечь больше голосов. После установки вам необходимо добавить пути к внешнему коду (относительно папки проекта) и перезагрузить проект.

2. Существует ли версия или обходной путь для ReSharper 9.1?

Ответ №2:

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

В своих проектах я использую следующие целевые объекты MSBuild для создания пустых файлов с помощью сенсорной задачи. Возможно, вам потребуется внести некоторые изменения — в моем случае целевые файлы фактически определены в проекте, а не на уровне решения; и действие сборки для файлов установлено в «None», что важно для понимания того, как работают эти цели.

 <?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

<!--
Creates empty 'dummy' files for any files that are specified but do not exist. 
To be processed, the following must be true:

1. The file is included in an ItemGroup called CanCreateDummy, e.g.
      <ItemGroup>
        <CanCreateDummy Include="SomeFile.cs" />
      </ItemGroup>
   If you want to specify a CanCreateDummy file in the .csproj file, you would
   modify the above slightly as follows to prevent it appearing twice:
      <ItemGroup>
        <CanCreateDummy Include="SomeFile.cs">
          <Visible>false</Visible>
        </CanCreateDummy>
      </ItemGroup>

2. The file is included in the ItemGroup called None. This is normally performed 
   by adding the file to the project in the usual way through Visual Studio, and 
   then setting the file's Build Action property to None.
-->
<Target
  Name="CreateDummyFiles"
  AfterTargets="BeforeBuild"
    >
<!--
This voodoo creates the intersection of 2 lists - @(CanCreateDummy) and @(None) 
(this latter item is defined in the project file). We want to create a filtered 
list of all items that are in both these lists, which is called _ProjectDummyFiles.
See http://blogs.msdn.com/b/msbuild/archive/2006/05/30/610494.aspx for how the 
Condition voodoo works.
-->
<CreateItem Include="@(CanCreateDummy)" Condition="'%(Identity)' != ''  and '@(None)' != ''" >
  <Output TaskParameter="Include" ItemName="_ProjectDummyFiles"/>
</CreateItem>

<Message
    Text="Creating dummy settings file @(_ProjectDummyFiles)"
    Condition=" !Exists('%(_ProjectDummyFiles.FullPath)')"
        />

<Touch
    AlwaysCreate="true"
    Files="@(_ProjectDummyFiles)"
    Condition=" !Exists('%(_ProjectDummyFiles.FullPath)')"
        />

</Target>
</Project>
 

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

Богатый

Комментарии:

1. Спасибо, приятель, отлично сработало, очень хитрое решение! Сначала я подумал, что это выглядит довольно банально, но после его реализации он кажется очень чистым (учитывая обстоятельства: p).

2. Большое спасибо — рад, что это сработало. Это немного халтурно, но, что более важно, надежно 🙂