区分Nuget源代码包的项目语言
Distinguish project languages for Nuget source code packages
假设我想构建一个 Nuget 包,它将源代码文件放入它安装到的 Visual Studio 项目中。好吧,这对 the "content"-approach.
很好用
这意味着我可以将这些文件放入以下文件夹结构中,以自动将它们添加到文件系统和 VS 项目中:
.\ThePackage.nuspec
└ content\TheFile.cs
└ content\TheOtherFile.cs
有了这样的包,Nuget 会自动将源代码文件直接添加到项目中。但是,它对 两个 文件都是这样做的,所以我发现没有办法让它成为条件。
"Why?" 您可能会问 - 好吧,我真的没有两个 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 文件添加到安装时执行的 nuget 包中。在那里你可以放置一些逻辑,比如检测项目中使用的语言等和 removed/add 不需要或想要的文件
对于所有搜索解决方案的访问者。使用@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)
假设我想构建一个 Nuget 包,它将源代码文件放入它安装到的 Visual Studio 项目中。好吧,这对 the "content"-approach.
很好用这意味着我可以将这些文件放入以下文件夹结构中,以自动将它们添加到文件系统和 VS 项目中:
.\ThePackage.nuspec
└ content\TheFile.cs
└ content\TheOtherFile.cs
有了这样的包,Nuget 会自动将源代码文件直接添加到项目中。但是,它对 两个 文件都是这样做的,所以我发现没有办法让它成为条件。
"Why?" 您可能会问 - 好吧,我真的没有两个 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 文件添加到安装时执行的 nuget 包中。在那里你可以放置一些逻辑,比如检测项目中使用的语言等和 removed/add 不需要或想要的文件
对于所有搜索解决方案的访问者。使用@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)