2016-07-12 83 views
7

Sto creando un modulo di script e utilizzando un manifest per esportare membri di script e impostare altre proprietà del modulo. Ho seguito praticamente tutti i manifest di esempio che ho trovato e ho persino utilizzato New-ModuleManifest per creare un manifest di base con le proprietà che desidero, non riesco ancora a ottenere le variabili che voglio esportare per esportare effettivamente.Le variabili che ho elencato per esportare nel manifest del mio modulo powershell non stanno effettivamente esportando

L'intento è quello di fare tutte le dichiarazioni del manifesto senza dover utilizzare Export-ModuleMember nello script del modulo.

Ecco il modulo di script:

# 
# Widget.psm1 
# 

[System.Random]$rGen = New-Object System.Random; 
[string]$WidgetBaseName = $null; 
[string]$WidgetColor = "Blue"; 

function Get-WidgetName 
{ 
    param 
    (
     [Parameter(Mandatory=$true)] 
     [string]$widgetName, 
     [switch]$appendRandomNumber 
    ) 

    if (![string]::IsNullOrEmpty($WidgetBaseName)) 
    { 
     $widgetName = $WidgetBaseName + $widgetName; 
    } 

    if ($appendRandomNumber) 
    { 
     return [string]::Format("{0}{1:D4}", $widgetName, $rGen.Next(10000)); 
    } 
    else 
    { 
     return $widgetName; 
    } 
} 

function Get-WidgetBlessing() 
{ 
    return [string]::Format("A thousand blessings upon your {0} widget!", $WidgetColor); 
} 

e questo è il manifesto:

# 
# Widget.psd1 
# 

@{ 

# Script module or binary module file associated with this manifest 
RootModule = 'Widget.psm1' 

# Version number of this module. 
ModuleVersion = '0.0.0.1' 

# ID used to uniquely identify this module 
GUID = 'c4437164-ea47-4148-97ed-48737bd5824d' 

# Author of this module 
Author = 'Widget Developer' 

# Company or vendor of this module 
CompanyName = 'Fictional Company Inc.' 

# Copyright statement for this module 
Copyright = '(c) 2016 Fictional Company. All rights reserved.' 

# Description of the functionality provided by this module 
Description = 'Widget Module' 

# Minimum version of the Windows PowerShell engine required by this module 
# PowerShellVersion = '' 

# Name of the Windows PowerShell host required by this module 
# PowerShellHostName = '' 

# Minimum version of the Windows PowerShell host required by this module 
# PowerShellHostVersion = '' 

# Minimum version of the .NET Framework required by this module 
# DotNetFrameworkVersion = '' 

# Minimum version of the common language runtime (CLR) required by this module 
# CLRVersion = '' 

# Processor architecture (None, X86, Amd64) required by this module 
# ProcessorArchitecture = '' 

# Modules that must be imported into the global environment prior to importing this module 
# RequiredModules = @() 

# Assemblies that must be loaded prior to importing this module 
# RequiredAssemblies = @() 

# Script files (.ps1) that are run in the caller's environment prior to importing this module 
# ScriptsToProcess = @() 

# Type files (.ps1xml) to be loaded when importing this module 
# TypesToProcess = @() 

# Format files (.ps1xml) to be loaded when importing this module 
# FormatsToProcess = @() 

# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess 
# NestedModules = @() 

# Functions to export from this module 
FunctionsToExport = @("Get-WidgetName", "Get-WidgetBlessing") 

# Cmdlets to export from this module 
# CmdletsToExport = @() 

# Variables to export from this module 
VariablesToExport = 'WidgetBaseName', 'WidgetColor' 

# Aliases to export from this module 
AliasesToExport = '*' 

# List of all modules packaged with this module 
# ModuleList = @() 

# List of all files packaged with this module 
# FileList = @() 

# Private data to pass to the module specified in RootModule/ModuleToProcess 
# PrivateData = '' 

# HelpInfo URI of this module 
# HelpInfoURI = '' 

# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. 
# DefaultCommandPrefix = '' 

} 

Per controllare ciò che i membri vengono esportati, corro i seguenti comandi nella mia finestra PowerShell:

Import-Module Widget 
Get-Module -Name Widget | fl 

Questa è l'uscita. Notare l'assenza evidente di qualsiasi variabile esportata.

Name    : Widget 
Path    : D:\SRE\PowerShell\Widget\Widget.psm1 
Description  : Widget Module 
ModuleType  : Script 
Version   : 0.0.0.1 
NestedModules  : {} 
ExportedFunctions : {Get-WidgetBlessing, Get-WidgetName} 
ExportedCmdlets : 
ExportedVariables : 
ExportedAliases : 

Perché è questo? Sto usando il manifest generato da New-ModuleManifest (New-ModuleManifest -VariablesToExport WidgetBaseName WidgetColor). Quello strumento è rotto, o c'è qualcos'altro nel manifest che sta causando questo comportamento?

UPDATE:

ho aggiunto la seguente riga alla fine dello script modulo:

Export-ModuleMember -Variable WidgetBaseName, WidgetColor 

ho cambiato il valore della VariablesToExport a '*' nel file manifesto.

Ora, quando ho importare il modulo ed eseguire il controllo come descritto sopra, ottengo questo invece:

Name    : Widget 
Path    : D:\SRE\PowerShell\Widget\Widget.psm1 
Description  : Widget Module 
ModuleType  : Script 
Version   : 0.0.0.1 
NestedModules  : {} 
ExportedFunctions : 
ExportedCmdlets : 
ExportedVariables : {WidgetBaseName, WidgetColor} 
ExportedAliases : 

... dove ha fatto le mie funzioni esportate andare?

+0

Possibile duplicato di [Powershell Module Design - Export-ModuleMember] (http: // stackoverflow.it/questions/22205103/powershell-module-design-export-modulemember) – briantist

+0

Niente è rotto; devi usare 'Export-ModuleMember'; vedere il duplicato collegato. – briantist

+1

Ecco un link che si espande su ciò che @briantist sta dicendo: http://www.itidea.nl/index.php/powershell-export-modulemember-vs-export-keys-in-manifest/. Non ho mai provato ad esportare variabili prima; il comportamento descritto in questo post SO e questo link sono decisamente contro intuitivi IMHO. –

risposta

3

Così, per ragioni di completezza e per chiunque che atterra su questa questione in futuro ho intenzione di riassumere la conversazione che abbiamo avuto nei commenti alla domanda del PO.

Tutte le funzioni vengono esportate da un modulo per impostazione predefinita, nessun altro membro mostra questo comportamento. È come se Export-ModuleMember -Function * venisse chiamato implicitamente dal modulo. È quindi possibile limitare ulteriormente quali funzioni vengono esportate tramite la chiave ExportedFunctions nel manifest del modulo, ad es. ExportedFunctions : {Get-WidgetBlessing, Get-WidgetName}.

Se si desidera esportare variabili o alias, è necessario aggiungere esplicitamente una chiamata a Export-ModuleMember -Variable <what you want to export> o Export-ModuleMember -Alias <what you want to export> nel modulo. Tuttavia, una volta aggiunta una chiamata esplicita a Export-ModuleMember, la chiamata implicita a Export-ModuleMember -Function * non si verifica più. Devi ricordare di aggiungere Export-ModuleMember -Function * al modulo in modo esplicito se aggiungi anche un'altra chiamata esplicita a Export-ModuleMember, altrimenti le tue funzioni non verranno più esportate.

+0

Sono d'accordo. Che funzioni. – user1956801

+1

In realtà preferisco farlo inverso: chiama "Export-ModuleMember" per limitare ciò che viene esportato dal modulo 'psm1', e quindi lasciare questi campi come' '*' 'nel manifest. Ciò significa che posso gestire tutti i nomi dei moduli di cose in * un file *, invece di saltare avanti e indietro tanto. – jpmc26

Problemi correlati