ReSharper - 在代码检查中包含外部源文件
Posted
技术标签:
【中文标题】ReSharper - 在代码检查中包含外部源文件【英文标题】:ReSharper - Include external source files in code inspection 【发布时间】:2011-12-14 13:49:49 【问题描述】:背景:
我们在 .NET C# 解决方案中使用了第 3 方工具。该工具有自己的语法并与 Visual Studio 集成。当我们使用这个工具时,我们在 Visual Studio 中编写它的标记,然后当我们构建解决方案时,自定义工具会运行并根据我们编写的标记生成一个 .cs 文件。
这个生成的源文件包含一个版本号,当我们将它们签入版本控制时会导致问题(无尽的冲突)。我们的理解是,最好不要签入生成的源文件。
所以我们从 SVN 中排除了生成的 .cs 文件,然后我们遇到的下一个问题是 Visual Studio 解决方案引用了这些文件,所以当 TeamCity(我们的持续构建/集成软件)去构建解决方案时,它会由于找不到这些文件,因此立即失败。
然后我们从解决方案中删除了这些,并将它们从 SVN 中排除,这解决了最初的问题,我们不再检查生成的代码并且它在 TeamCity 中构建良好(因为每次构建都会重新生成文件)。
我们现在有一个新问题 - 由于生成的文件不再包含在解决方案中,智能感知和代码检查失败,因为找不到生成的类。解决方案构建得很好(同样代码在构建过程中重新生成)。
问题
有没有办法告诉 ReSharper 在其代码检查中包含生成的 .cs 文件?这些文件在解决方案之外,但它们位于 obj 目录中。
干杯,
泰勒
【问题讨论】:
您不能将文件保留在解决方案中,并添加一个预构建步骤以生成一个空的 .cs 文件(如果它不存在)吗?这将使构建保持愉快。我在我们的项目中对包含开发人员可覆盖的数据库连接字符串的文件使用了类似的技术。如果有帮助,我有一些示例 MSBuild 目标。 嗨,RichTea,听起来不错,如果可能的话,我很想看看你的样品? 【参考方案1】:我们遇到了类似的问题,想不出一个好的解决方案,所以我写了一个 ReSharper 扩展来包含外部代码:
https://resharper-plugins.jetbrains.com/packages/ReSharper.ExternalCode
【讨论】:
这应该会得到更多的支持。安装后,你必须添加外部代码的路径(相对于项目文件夹)并重新加载项目。 是否有 ReSharper 9.1 的版本或解决方法?【参考方案2】:正如我在评论中提到的,一种解决方法是将生成的文件保留在解决方案中(但不在源代码管理中),同时添加一个预构建步骤来创建空的 .cs 文件(如果真正生成的文件不是present) 以便文件在构建期间始终可用。
在我的项目中,我使用以下 MSBuild 目标通过 Touch 任务生成空文件。您可能需要进行一些修改——在我的例子中,目标文件实际上是在一个项目中定义的,而不是在解决方案级别;并且文件的构建操作设置为“无”,这对于了解这些目标的工作方式很重要。
<?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>
希望对你有帮助
丰富
【讨论】:
感谢伙伴完美的非常狡猾的解决方案!起初我认为它看起来很hacky,但在实施后感觉非常干净(考虑到情况:p)。 非常感谢 - 很高兴它成功了。 '这有点 hacky 但更重要的是它是可靠的 :)以上是关于ReSharper - 在代码检查中包含外部源文件的主要内容,如果未能解决你的问题,请参考以下文章