所以,我终于真的需要对NuGet的Web.config.transform系统不支持的Web.config做一些事情。
在花了2个小时搜索文档之后,我意识到在Web.config.transform被应用之前或之后是否发生了Install.ps1。
我过去常常定义一个Web.config.transform文件:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="resizer" type="ImageResizer.ResizerSection"/>
</configSections>
</configuration>
这是新的 - 支持中等信任所需的requirePermission="false"
属性。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false"/>
</configSections>
</configuration>
如果我发布一个新的Web.config.transform版本,它将崩溃他们的ASP.NET项目,因为会有两个section元素:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="resizer" type="ImageResizer.ResizerSection" />
<section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false"/>
</configSections>
</configuration>
如果Install.ps1在 Web.config.transform之前发生,我可以删除configuration/configSections/section[@name='resizer']
的所有匹配项。如果在之后发生,那么我需要选择其中一个要删除的副本。
这是一个非常容易解决的问题,但尚未在互联网论坛上得到解答,并且通过发布它我希望能让下一个Nuggetter的生活更轻松。
答案 0 :(得分:1)
我刚刚阅读了NuGet代码,安装.ps1在 Web.config.transform之后发生了。
在下面的NuGet代码中,在ExtractPackageFilesToProject中调用Web.config.transform,而在最后一个事件OnPackagageReferenceAdded中调用installs.ps1:
protected void AddPackageReferenceToProject(IPackage package)
{
PackageOperationEventArgs args = CreateOperation(package);
OnPackageReferenceAdding(args);
if (args.Cancel)
{
return;
}
ExtractPackageFilesToProject(package);
Logger.Log(MessageLevel.Info, NuGetResources.Log_SuccessfullyAddedPackageReference, package.GetFullName(), Project.ProjectName);
OnPackageReferenceAdded(args);
}
private void OnPackageReferenceAdded(object sender, PackageOperationEventArgs e)
{
Project project = FindProjectFromFileSystem(e.FileSystem);
Debug.Assert(project != null);
_providerServices.ScriptExecutor.ExecuteScript(e.InstallPath, PowerShellScripts.Install, e.Package, project, this);
}