如何在 ASP.NET Core Web Deploy 包中设置 ACL?
How do you set ACLs in an ASP.NET Core Web Deploy package?
在 ASP.NET Core 之前,使用 certain MSBuild targets 在 Web 部署包中调整 ACL 非常容易:您可以在 AddIisSettingAndFileContentsToSourceManifest
和 [=13] 之后添加一些自定义步骤=] 目标。
现在,根据我自己的实验和 issues like this one,在 Core 中,这些技巧不再有效,因为
The tasks and targets for ASP.NET Core projects has been re-written ... The target names used in ASP.NET projects are not the same for ASP.NET Core.
我试过 Microsoft.NET.Sdk.Publish.MSDeployPackage.targets 中显示的目标,但我似乎无法让它工作。我在构建包期间遇到此类错误:
The target "MSDeployPackagePublish" listed in a BeforeTargets attribute ... does not exist in the project, and will be ignored.
新目标是什么?我如何更改 ASP.NET Core Web Deploy 项目中的 ACL?
令人费解的是,Core 团队似乎已经删除了 通过 MSBuild 自定义 MS Deploy 管道的功能。这些担忧至少可以追溯到 2017 年 several GitHub issues,因此他们似乎无意恢复此功能。
问题的症结在于 MS Deploy 目标已“简化以提高可读性”。
_CreateManifestFiles
target,过去由多个目标组成,我们可以在这些目标之间注入我们自己的目标,现在这样做:
- 删除所有先前指定的
MsDeploySourceManifest
规则。
- 添加一些硬编码
MsDeploySourceManifest
规则。
- 将清单 XML 写入磁盘。
同样,_CreateParameterFiles
target 现在这样做:
- 删除所有先前指定的
MsDeployDeclareParameters
规则。
- 添加一些硬编码
MsDeployDeclareParameters
规则。
- 将参数 XML 写入磁盘。
幸运的是,新的锁定设计有一个非常糟糕的解决方法。
1。重新创建清单 XML
所有目标都是公开可用的,所以我的解决方案只是用我自己的目标重写 _CreateManifestFiles
目标——并覆盖清单 XML。这是我在 .pubxml
中得到的结果:
<Target Name="ReCreateManifestFile" AfterTargets="_CreateManifestFiles">
<ItemGroup>
<MsDeploySourceManifest Remove="@(MsDeploySourceManifest)" />
<MsDeploySourceManifest Include="IisApp">
<Path>$(PublishIntermediateOutputPath)</Path>
</MsDeploySourceManifest>
<MsDeploySourceManifest Include="setAcl">
<Path>$(PublishIntermediateOutputPath)logs</Path>
<setAclAccess>Read,Write</setAclAccess>
<setAclResourceType>Directory</setAclResourceType>
<AdditionalProviderSettings>setAclAccess;setAclResourceType</AdditionalProviderSettings>
</MsDeploySourceManifest>
</ItemGroup>
<CreateManifestFile Manifests="@(MsDeploySourceManifest)" ManifestFile="$(_MsDeploySourceManifestPath)" />
</Target>
请注意,此目标在 _CreateManifestFiles
之后立即执行。
这是简单的部分!
2。重新创建参数 XML
我使用相同的策略创建参数文件。如果您复制 _CreateParameterFiles
但添加您自己的 MsDeployDeclareParameters
,它 几乎 可以满足您的所有需求。不幸的是,新的 SDK 还删除了这些规则设置 ExcludeFromSetParameter
的能力——如果您 read the code,该值甚至永远不会被反序列化。
无法从 SetParameters.xml 中排除参数,您最终得到的 SetParameters.xml 如下所示:
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site/GeoGrok" />
<setParameter name="LogsSetAclParam" value="" /> <!-- not what you want :( -->
</parameters>
部署时不能忽略 SetParameters.xml 中的任何参数,即使它有 DefaultValue
。这意味着如果您有一个默认值,例如 {IIS Web Application Name}/logs
.
,MSDeploy 将不会自动替换 IIS 应用程序名称
此外,SDK 的 CreateParameterFile
调用甚至不包含 DeclareParameterFile
属性,因此 DefaultValue
一开始就不会写入 parameters.xml!
我采用的(再次,糟糕的)解决方案是:
- 用您自己的
MsDeployDeclareParameters
元素重写 _CreateParameterFiles
。
- 调整
CreateParameterFile
以创建正确的 parameters.xml 文件。
- 复制静态 SetParameters.xml 文件,该文件仅包含您希望部署团队看到的参数。在我的例子中,只有 IIS Web 应用程序名称 参数。
我的静态 SetParameters.xml 文件(我放在项目根目录中)如下所示:
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site" />
</parameters>
这是我的 .pubxml
文件中完成的参数目标:
<Target Name="ReCreateParametersFile" AfterTargets="_CreateParameterFiles">
<ItemGroup>
<MsDeployDeclareParameters Remove="@(MsDeployDeclareParameters)" />
<MsDeployDeclareParameters Include="IIS Web Application Name">
<Kind>ProviderPath</Kind>
<Scope>IisApp</Scope>
<Match>$(PublishIntermediateOutputPath)</Match>
<DefaultValue>$(DeployIisAppPath)</DefaultValue>
<Value>$(DeployIisAppPath)</Value>
<Tags>IisApp</Tags>
<Priority></Priority>
<ExcludeFromSetParameter>false</ExcludeFromSetParameter>
</MsDeployDeclareParameters>
<MsDeployDeclareParameters Include="LogsSetAclParam">
<Kind>ProviderPath</Kind>
<Scope>setAcl</Scope>
<Match>$(PublishIntermediateOutputPath)logs</Match>
<DefaultValue>{IIS Web Application Name}/logs</DefaultValue>
<Tags>Hidden</Tags>
<Priority>$(VsSetAclPriority)</Priority>
<ExcludeFromSetParameter>true</ExcludeFromSetParameter> <!-- I'm useless! -->
</MsDeployDeclareParameters>
</ItemGroup>
<CreateParameterFile Parameters="@(MsDeployDeclareParameters)"
DeclareParameterFile="$(_MSDeployParametersFilePath)"
DeclareSetParameterFile="$(_MSDeploySetParametersFilePath)"
IncludeDefaultValue="True"
OptimisticParameterDefaultValue="$(EnableOptimisticParameterDefaultValue)"
SetParameterFile="$(_MSDeploySetParametersFilePath)"
GenerateFileEvenIfEmpty="True" />
<Copy SourceFiles="$(MSBuildProjectDirectory)\GeoGrok.Web.SetParameters.xml" DestinationFiles="$(_MSDeploySetParametersFilePath)" />
</Target>
请注意 Copy
最后一步。
祝你好运!
在 ASP.NET Core 之前,使用 certain MSBuild targets 在 Web 部署包中调整 ACL 非常容易:您可以在 AddIisSettingAndFileContentsToSourceManifest
和 [=13] 之后添加一些自定义步骤=] 目标。
现在,根据我自己的实验和 issues like this one,在 Core 中,这些技巧不再有效,因为
The tasks and targets for ASP.NET Core projects has been re-written ... The target names used in ASP.NET projects are not the same for ASP.NET Core.
我试过 Microsoft.NET.Sdk.Publish.MSDeployPackage.targets 中显示的目标,但我似乎无法让它工作。我在构建包期间遇到此类错误:
The target "MSDeployPackagePublish" listed in a BeforeTargets attribute ... does not exist in the project, and will be ignored.
新目标是什么?我如何更改 ASP.NET Core Web Deploy 项目中的 ACL?
令人费解的是,Core 团队似乎已经删除了 通过 MSBuild 自定义 MS Deploy 管道的功能。这些担忧至少可以追溯到 2017 年 several GitHub issues,因此他们似乎无意恢复此功能。
问题的症结在于 MS Deploy 目标已“简化以提高可读性”。
_CreateManifestFiles
target,过去由多个目标组成,我们可以在这些目标之间注入我们自己的目标,现在这样做:
- 删除所有先前指定的
MsDeploySourceManifest
规则。 - 添加一些硬编码
MsDeploySourceManifest
规则。 - 将清单 XML 写入磁盘。
同样,_CreateParameterFiles
target 现在这样做:
- 删除所有先前指定的
MsDeployDeclareParameters
规则。 - 添加一些硬编码
MsDeployDeclareParameters
规则。 - 将参数 XML 写入磁盘。
幸运的是,新的锁定设计有一个非常糟糕的解决方法。
1。重新创建清单 XML
所有目标都是公开可用的,所以我的解决方案只是用我自己的目标重写 _CreateManifestFiles
目标——并覆盖清单 XML。这是我在 .pubxml
中得到的结果:
<Target Name="ReCreateManifestFile" AfterTargets="_CreateManifestFiles">
<ItemGroup>
<MsDeploySourceManifest Remove="@(MsDeploySourceManifest)" />
<MsDeploySourceManifest Include="IisApp">
<Path>$(PublishIntermediateOutputPath)</Path>
</MsDeploySourceManifest>
<MsDeploySourceManifest Include="setAcl">
<Path>$(PublishIntermediateOutputPath)logs</Path>
<setAclAccess>Read,Write</setAclAccess>
<setAclResourceType>Directory</setAclResourceType>
<AdditionalProviderSettings>setAclAccess;setAclResourceType</AdditionalProviderSettings>
</MsDeploySourceManifest>
</ItemGroup>
<CreateManifestFile Manifests="@(MsDeploySourceManifest)" ManifestFile="$(_MsDeploySourceManifestPath)" />
</Target>
请注意,此目标在 _CreateManifestFiles
之后立即执行。
这是简单的部分!
2。重新创建参数 XML
我使用相同的策略创建参数文件。如果您复制 _CreateParameterFiles
但添加您自己的 MsDeployDeclareParameters
,它 几乎 可以满足您的所有需求。不幸的是,新的 SDK 还删除了这些规则设置 ExcludeFromSetParameter
的能力——如果您 read the code,该值甚至永远不会被反序列化。
无法从 SetParameters.xml 中排除参数,您最终得到的 SetParameters.xml 如下所示:
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site/GeoGrok" />
<setParameter name="LogsSetAclParam" value="" /> <!-- not what you want :( -->
</parameters>
部署时不能忽略 SetParameters.xml 中的任何参数,即使它有 DefaultValue
。这意味着如果您有一个默认值,例如 {IIS Web Application Name}/logs
.
此外,SDK 的 CreateParameterFile
调用甚至不包含 DeclareParameterFile
属性,因此 DefaultValue
一开始就不会写入 parameters.xml!
我采用的(再次,糟糕的)解决方案是:
- 用您自己的
MsDeployDeclareParameters
元素重写_CreateParameterFiles
。 - 调整
CreateParameterFile
以创建正确的 parameters.xml 文件。 - 复制静态 SetParameters.xml 文件,该文件仅包含您希望部署团队看到的参数。在我的例子中,只有 IIS Web 应用程序名称 参数。
我的静态 SetParameters.xml 文件(我放在项目根目录中)如下所示:
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site" />
</parameters>
这是我的 .pubxml
文件中完成的参数目标:
<Target Name="ReCreateParametersFile" AfterTargets="_CreateParameterFiles">
<ItemGroup>
<MsDeployDeclareParameters Remove="@(MsDeployDeclareParameters)" />
<MsDeployDeclareParameters Include="IIS Web Application Name">
<Kind>ProviderPath</Kind>
<Scope>IisApp</Scope>
<Match>$(PublishIntermediateOutputPath)</Match>
<DefaultValue>$(DeployIisAppPath)</DefaultValue>
<Value>$(DeployIisAppPath)</Value>
<Tags>IisApp</Tags>
<Priority></Priority>
<ExcludeFromSetParameter>false</ExcludeFromSetParameter>
</MsDeployDeclareParameters>
<MsDeployDeclareParameters Include="LogsSetAclParam">
<Kind>ProviderPath</Kind>
<Scope>setAcl</Scope>
<Match>$(PublishIntermediateOutputPath)logs</Match>
<DefaultValue>{IIS Web Application Name}/logs</DefaultValue>
<Tags>Hidden</Tags>
<Priority>$(VsSetAclPriority)</Priority>
<ExcludeFromSetParameter>true</ExcludeFromSetParameter> <!-- I'm useless! -->
</MsDeployDeclareParameters>
</ItemGroup>
<CreateParameterFile Parameters="@(MsDeployDeclareParameters)"
DeclareParameterFile="$(_MSDeployParametersFilePath)"
DeclareSetParameterFile="$(_MSDeploySetParametersFilePath)"
IncludeDefaultValue="True"
OptimisticParameterDefaultValue="$(EnableOptimisticParameterDefaultValue)"
SetParameterFile="$(_MSDeploySetParametersFilePath)"
GenerateFileEvenIfEmpty="True" />
<Copy SourceFiles="$(MSBuildProjectDirectory)\GeoGrok.Web.SetParameters.xml" DestinationFiles="$(_MSDeploySetParametersFilePath)" />
</Target>
请注意 Copy
最后一步。
祝你好运!