区分Nuget源代码包的项目语言

时间:2017-10-31 19:38:38

标签: c# vb.net nuget nuget-package nuget-spec

让我们说我想构建一个Nuget包,它将源代码文件放到它安装到的Visual Studio项目中。嗯,这对the "content"-approach非常好。

这意味着我可以将以下文件夹结构中的这些文件自动添加到文件系统和VS项目中:

.\ThePackage.nuspec
    └ content\TheFile.cs
    └ content\TheOtherFile.cs

使用这样的包,Nuget会自动将源代码文件直接添加到项目中。但是,它使用两个文件来做到这一点,所以我发现没有办法让这个条件化。

"为什么?" 你可能会问 - 好吧,我真的没有两个cs个文件。我有一个用于C#,一个用于Visual Basic在不同语言中做同样的事情。所以我需要区分C#和Visual Basic项目文件。上面的内容方法有这样的结构......

.\ThePackage.nuspec
    └ content\TheFile.cs
    └ content\TheFile.vb

...当然会导致与每个项目中的csvb文件混合。

有没有办法告诉Nuget我只想在C#项目中使用cs文件,在Visual Basic项目中使用vb文件,而不需要提供两个Nuget包,如{{1 }和ThePackage for C#

2 个答案:

答案 0 :(得分:1)

您可以将init.ps1文件添加到在安装时执行的nuget-package。在那里,您可以放置​​一些逻辑,例如检测项目中使用的语言等,并删除/添加不需要的或想要的文件

答案 1 :(得分:1)

为所有寻找解决方案的访问者。使用@ D.J.建议的powershell方法,我最终得到了下面的脚本。

nuget包有两个内容文件:

content\XXXXXX.cs
content\XXXXXX.vb

这样,两者都由Nuget安装(到文件系统和VS项目)。

之后,我运行以下脚本再次删除未使用的文件。

param($installPath, $toolsPath, $package, $project)


# All XXXXXX code files (for C# and VB) have been added by nuget because they are ContentFiles.
# Now, try to detect the project language and remove the unnecessary file after the installation.


function RemoveUnnecessaryCodeFile($project)
{
    $projectFullName = $project.FullName
    $codeFile = ""
    $removeCodeFile = ""

    if ($projectFullName -like "*.csproj*")
    {
        $codeFile = "XXXXXX.cs"
        $removeCodeFile = "XXXXXX.vb"
        Write-Host "Identified as C# project, installing '$codeFile'"
    }

    if ($projectFullName -like "*.vbproj*")
    {
        $codeFile = "XXXXXX.vb"
        $removeCodeFile = "XXXXXX.cs"
        Write-Host "Identified as VB project, installing '$codeFile'"
    }

    if ($removeCodeFile -eq "")
    {
        Write-Host "Could not find a supported project file (*.csproj, *.vbproj). You will get both code files and have to clean up manually. Sorry :("
    }
    else
    {
        # Delete the unnecessary code file (like *.vb for C# projects)
        #   Remove() would only remove it from the VS project, whereas 
        #   Delete() additionally deletes it from disk as well
        $project.ProjectItems.Item($removeCodeFile).Delete()
    }
}

RemoveUnnecessaryCodeFile -Project ($project)