Install.ps1或Web.config.transform - 首先发生?

时间:2012-03-26 19:13:31

标签: xml powershell web-config install nuget

所以,我终于真的需要对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的生活更轻松。

1 个答案:

答案 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);
    }