【问题标题】:Distinguish project languages for Nuget source code packages区分 Nuget 源代码包的项目语言
【发布时间】:2017-10-31 19:38:38
【问题描述】:

假设我想构建一个 Nuget 包,它将源代码文件放入它安装到的 Visual Studio 项目中。好吧,这对the "content"-approach 非常有效。

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

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

有了这样的包,Nuget 会自动将源代码文件直接添加到项目中。但是,它对 both 文件执行此操作,因此我没有办法将其设为条件。

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

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

...当然会导致每个项目中的cs 和vb 文件混合在一起。

有没有办法告诉 Nuget 我只想在 C# 项目中拥有 cs 文件和在 Visual Basic 项目中拥有 vb 文件,而无需提供两个 Nuget 包,如 ThePackage for C# 和 ThePackage for VB ?

【问题讨论】:

  • 您可以将 init.ps1-file 添加到安装时执行的 nuget-package。在那里您可以放置​​一些逻辑,例如检测项目中使用的语言等并删除/添加不需要或想要的文件
  • 我解决了 - 如果您将此作为答案发布,我可以给您一些积分。

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


【解决方案1】:

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

【讨论】:

  • 我添加了自己的答案以提供一些源代码(它在 cmets 中太小了)。再次感谢。
【解决方案2】:

适用于所有寻求解决方案的访问者。使用@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 2019-03-23
    • 2021-09-19
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多