Nuget Package Explorer - 有一种方法可以提示用户输入包中某个文件中某个字段的值

时间:2013-11-11 14:11:07

标签: nuget nuget-package

我创建了一个包含web.config.transform文件的包 - 也就是说,安装包时要添加到解决方案中现有web.config的部分web.config。在这个web.config.transform中,我有(显示部分代码):

<add name="**NAME**-Local" connectionString="data source=**DB SERVER**;initial catalog=**DATABASE**;user id=**USER ID**;password=**PASSWORD**;" providerName="System.Data.SqlClient" />

当开发人员将此包添加到他们的解决方案中时,会将上述代码行添加到连接字符串元素中,具有双星号的部分在每个应用程序中都会有所不同。例如,开发人员1正在开发一个应用程序,其数据库服务器名为“WidgetsDb”。好的,所以“WidgetsDb”会替换双星号中的DB SERVER。太棒了,现在开发人员2正在开发一个使用名为“BicyclesDb”的数据库服务器的应用程序。因此,正如您所看到的,这两个开发人员正在使用不同的数据库服务器。

我设想解决这个问题就像安装NuGet包时弹出一样,提示用户他们的数据库服务器名称是什么,他们的数据库名称是什么,用户ID是什么,密码是什么等等。此数据将用于上面的连接字符串,您可以在其中看到双星号。我希望我有意义。这可能吗?我知道你可以在包中引用不同的标记,例如$ rootnamespace $,$ id $,$ version $,$ author $等。

1 个答案:

答案 0 :(得分:3)

我会使用PowerShell构建的表单来收集输入。这可以通过向您的软件包添加install.ps1文件来实现,该软件包将在安装软件包时运行。此代码示例大致是您创建表单所需的内容,并使其在安装程序包期间弹出。 $ databaseName.Text将包含他们输入的内容。

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

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = "Data Entry Form"
    $objForm.Size = New-Object System.Drawing.Size(300,200) 
    $objForm.StartPosition = "CenterScreen"

    $objForm.KeyPreview = $True
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
        {$x=$databaseName.Text;$objForm.Close()}})
    $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
        {$objForm.Close()}})

    $OKButton = New-Object System.Windows.Forms.Button
    $OKButton.Location = New-Object System.Drawing.Size(75,120)
    $OKButton.Size = New-Object System.Drawing.Size(75,23)
    $OKButton.Text = "OK"
    $OKButton.Add_Click({$objForm.Close()})
    $objForm.Controls.Add($OKButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Size(150,120)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = "Cancel"
    $CancelButton.Add_Click({$objForm.Close()})
    $objForm.Controls.Add($CancelButton)

    $objLabel = New-Object System.Windows.Forms.Label
    $objLabel.Location = New-Object System.Drawing.Size(10,20) 
    $objLabel.Size = New-Object System.Drawing.Size(280,20) 
    $objLabel.Text = "Please enter the database name in the space below:"
    $objForm.Controls.Add($objLabel) 

    $databaseName = New-Object System.Windows.Forms.TextBox 
    $databaseName.Location = New-Object System.Drawing.Size(10,40) 
    $databaseName.Size = New-Object System.Drawing.Size(260,20) 
    $objForm.Controls.Add($databaseName) 

    $objForm.Topmost = $True

    $objForm.Add_Shown({$objForm.Activate()})
    [void] $objForm.ShowDialog()

扩展此表单以捕获您需要的任何其他内容应该很容易。