2015-06-22 21 views
0

我想构建一个nuget包只用于设计时间包。该软件包包含使用自定义代码分析规则集的资源(规则集文件,构建道具文件和程序集)。我如何创建仅在设计时间的nuget包,在安装时不会添加程序集引用?

我nuspec文件(我CodeAnalysis装配项目中)看起来是这样的:

<package> 
    <metadata> 
     <id>$id$</id> 
     <version>$version$</version> 
     <authors>$author$</authors> 
     <description>$description$</description> 
     <references> 
     </references> 
     <developmentDependency>true</developmentDependency> 
    </metadata> 
    <files> 
     <!-- copy rules assembly to tools folder --> 
     <file src="bin\Release\CodeAnalysis.dll" target="tools\CodeAnalysis.dll" /> 
     <file src="tools\CodeAnalysis.ruleset" target="tools\CodeAnalysis.ruleset" /> 
     <file src="build\CodeAnalysis.props" target="build\CodeAnalysis.props" /> 
    </files> 
</package> 

当构建这个包,CodeAnalysis.dll组件存在于\lib\net40\CodeAnalysis.dll,并且副本中加入\tools\CodeAnalysis.dll

当我在另一个项目中使用此包时,默认行为是将对程序集的引用添加到项目中。由于这是一个只有设计/构建时间的程序集(仅在对项目执行代码分析时使用),因此我不希望nuget添加此引用。

我查看了nuspec文件的<references>部分,但是这并不能让我知道如何防止引用。

如何构建nuspec文件,以便在安装nuget包时nuget不添加项目引用?

回答

0

查看System.Diagnostics命名空间中的ConditionalAttribute类。有了这个,您可以指定一个条件编译符号,如果未定义,则[Conditional]属性的目标未编译到生成的程序集中。

通过这种方式,您可以定义一个CODE_ANALYSIS符号(或您选择的任何名称)并使用[Conditional("CODE_ANALYSIS")]属性修饰项目中的所有类型,方法,属性等。如果使用你的软件包的人还没有定义这个符号,那么他们生成的编译后的程序集将不包含对你的项目的引用,但是他们可以在设计时从中受益。

这是JetBrains使用他们Annotations NuGet package,有一个blog post约在这里:

http://blog.jetbrains.com/dotnet/2015/08/12/how-to-use-jetbrains-annotations-to-improve-resharper-inspections/

1

传递-tool命令行开关的NuGet。这将不包括作为引用程序集的DLL。

nuget pack MyProject.csproj -tool 
+0

是否可以在nuspec文件中指定它? (我直接从Visual Studio构建) –

+0

使用Visual Studio扩展? –

相关问题