2015-11-01 72 views
2

我在我的項目中使用extern alias,所以我需要將參考別名從global更改爲其他名稱。問題是,如果我使用Nuget添加引用,則每次更新包時,別名都將恢復爲global。有沒有辦法阻止這種情況發生?如何在nuget中使用extern別名

回答

1

這是不可能的,因爲在nuget更新後,它會刪除先前的程序集並添加一個新程序集,以便刪除程序集的別名...因此您必須將新別名重新添加到新更新的程序集中。

+0

是否有辦法來自動完成這一過程? –

+0

你可以閱讀更多關於[**擴展NuGet命令行**](http://devlicio.us/blogs/rob_reynolds/archive/2011/07/15/extend-nuget-command-line.aspx)..也許它有助於 –

1

您可以將install script添加到NuGet包中以添加別名。但是包的使用者將無法選擇不添加別名。以下是您可以在腳本中使用的一些代碼。我不是最強大的PowerShell,所以可能有更好的方式來做到這一點:)

# Standard Install.ps1 parameter list 
param($installPath, $toolsPath, $package, $project) 

# Name of the alias 
$alias = 'MyAlias' 

# Load the Microsoft.Build assembly to be able to access MS Build types 
Add-Type -AssemblyName Microsoft.Build 

# Load the csproj file 
$projectObject = New-Object Microsoft.Build.Evaluation.Project($project.FullName) 

# Search through the project items to find all references 
$referenceItems = $projectObject.Items | where ItemType -eq "Reference" 

# Find the reference that matches the package id 
# (this assumes your assembly name matches your package id) 
$item = $referenceItems | select @{Name='Reference'; Expression={$_}},@{Name='AssemblyName'; Expression={(New-Object System.Reflection.AssemblyName($_.UnevaluatedInclude)).Name}} | where AssemblyName -eq $package.Id | select Reference 

# If the reference doesnt already have an alias, add one and save the project 
if (($item.Reference.Metadata | where Name -eq 'Aliases') -eq $null) { 
    $item.Reference.SetMetadataValue('Aliases', $alias) 
    $projectObject.Save() 
} 

# Unload the project when done 
$projectObject.ProjectCollection.UnloadAllProjects() 
2

這是nuget引用的知道問題;在尚未支持裝配別名的情況下(尚未):https://github.com/NuGet/Home/issues/4989

幸運的解決方法是存在的;你可以添加特殊目標您的csproj將分配在即時別名:

<Target Name="ChangeAliasesOfNugetRefs" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences"> 
    <ItemGroup> 
     <ReferencePath Condition="'%(FileName)' == 'CoreCompat.System.Drawing'"> 
     <Aliases>CoreCompatSystemDrawing</Aliases> 
     </ReferencePath> 
    </ItemGroup> 
    </Target>