gpt4 book ai didi

asp.net - 如果 App_Data 不存在,如何让 msdeploy 创建它,但不删除远程目录的任何内容?

转载 作者:行者123 更新时间:2023-12-02 01:53:20 26 4
gpt4 key购买 nike

我有一个具有以下打包/发布 Web 设置的应用程序设置:

  • 仅运行此应用程序所需的文件
  • (未选中)排除生成的调试符号
  • (选中)从 App_Data 文件夹中排除文件
  • (选中)包括在打包/发布 SQL 选项卡中配置的所有数据库 - 注意我没有配置任何数据库
  • (未选中)包括 IIS Express 中配置的 IIS 设置

  • 在项目中,我有一个 App_Data 文件夹设置,主要用于处理应用程序日志。

    我希望看到(并期望)的行为如下:
  • 在初始部署到全新服务器时,将复制应用程序并创建一个 App_Data 文件夹,并为该应用程序分配写入权限。
  • 在后续部署中,App_Data 文件夹将被忽略,因为它已经存在并且“从 App_Data 文件夹中排除文件”被选中。

  • 但是,msdeploy 似乎没有执行第 1 步(如果我手动创建文件夹,第 2 步就可以)。除了这个 unanswered so question,我在网上找不到任何文档。这似乎证实了我看到的行为。

    在这种情况下,如何让 msdeploy 创建 App_Data 并分配初始部署的权限?

    最佳答案

    从头开始部署 App_Data

    @tdykstra 得到 this part right .为了获得 App_Data(并自动设置 ACL),我执行了以下操作:

  • 在 App_Data 中添加占位符文件
  • 将构建操作设置为占位符上的内容(我的占位符文件中包含文本,让偶然发现它的人知道它为什么在那里)。
  • 未选中 VS 2010 中项目属性的“打包/发布 Web”选项卡上的“从 App_Data 文件夹中排除文件”

  • 这将创建我的 App_Data 文件夹并准备好在服务器上使用。但是,每当我重新发布时,它都会导致我的所有文件都被删除。这是我上面问题中的问题 #2,与其他 SO question 非常相似。/ answer .

    防止服务器上的数据在后续发布事件中被删除

    MsDeploy 中有两种机制可能会让人感到困惑(至少我混淆了它们):
  • 排除文件
  • MsDeploy 跳过规则

  • 这些都可以用来解决问题,具体取决于场景:
  • @tdykstra's solution如果您:
  • 提前知道App_Data中的文件名(例如sqllite数据库)
  • 将文件包含在项目的 App_Data 文件夹中
  • 使用 MsDeploy 跳过规则告诉 MsDeploy 完全跳过服务器上对该目录和该目录中的文件的所有删除。这解决了所有情况下的问题,但涉及更多。

  • 实现 MsDeploy 跳过规则

    要实现跳过规则,您必须放弃 VS 2010 中的右键单击、“部署”选项,转而使用右键单击、打包、进入命令行、重新调整批处理文件并运行命令行)。如果您愿意忍受这种体验(我愿意,因为我正在通过 CI 过程将其全部自动化),以下是详细信息:
  • Edit the project file and add the following .请注意, AbsolutePath 参数是一个正则表达式,因此您可以花哨:
    <Target Name="AddCustomSkipRules">
    <ItemGroup>
    <MsDeploySkipRules Include="SkipDeleteAppData">
    <SkipAction>Delete</SkipAction>
    <ObjectName>filePath</ObjectName>
    <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
    <XPath>
    </XPath>
    </MsDeploySkipRules>
    <MsDeploySkipRules Include="SkipDeleteAppData">
    <SkipAction>Delete</SkipAction>
    <ObjectName>dirPath</ObjectName>
    <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
    <XPath>
    </XPath>
    </MsDeploySkipRules>
    </ItemGroup>
    </Target>
  • 包裹,不部署 该项目。这将在目标目录中创建一个 zip 文件和 .cmd 文件(由 Package/Publish Web 选项卡上的“Location where package will be created”定义)。默认情况下,这是 obj\Debug\Package(或 obj\Release\Package)
  • 使用生成的命令文件
  • 部署站点

    在我的测试中,您必须打包并运行命令文件。项目文件调整将告诉 msbuild 将必要的 -skip 规则放入命令文件中。但是,直接使用 VS 2010 doesn't seem to run the command file 中的“发布”功能(请参阅 this walkthrough 上的警告)...它直接调用 msdeploy 并且似乎不遵守项目文件跳过规则。我相信这是使用 msbuild -T:Package 和 msbuild -T:MsDeployPublish 来构建项目的 VS 之间的区别,但我还没有对此进行测试。

    最后,命令文件不太正确,至少在 VS 2010 SP1 中是这样。 this SO answer 中对出错的地方有很好的描述,但基本上,VS(或者/t:Package 目标可能是一个更好的罪魁祸首)设置命令文件以发布到机器而不指定站点。要解决此问题,您需要以某种方式获取“?site=sitename”(可能这是 ?site=Default+Web+Site,对于 https://machine:8172/MsDeploy.axd?site=Default 的完整 URL +Web+Site) 到 computerName 参数的末尾。

    我遇到的问题是命令文件(批处理文件)很难在命令行上使用 site= any ,因为它错误地解析了命令行参数(即使已转义)。除了直接修改 cmd 文件之外,我没有看到解决这个问题的方法,但是为了测试,我复制了我从失败的测试运行中看到的 msdeploy.exe 输出,并将其修改为直接调用 msdeploy.exe 而没有脚本。

    现在它可以工作了,我的目的是将它应用到我的 CI 构建过程中。我将为最终解决方案做的是:
  • 更改我的构建脚本以使用/T:Package(现在是/T:MsDeploy)
  • 使用脚本化的搜索/替换例程来更改生成的 cmd 部署脚本
  • 运行修改后的部署脚本

  • 这真的应该更容易。

    更新

    这是我在 PowerShell 中提出的脚本化搜索/替换例程:
    (Get-Content "project.deploy.cmd") 
    -replace('^set _ArgComputerName=$'
    ,"set ArgComputerName=https://server:8172/MsDeploy.axd?Site=Default+Web+Site")
    | Out-File -Encoding ascii deploy.cmd

    运行后,可以调用 deploy.cmd(不带/M 选项),它将按预期工作。

    关于asp.net - 如果 App_Data 不存在,如何让 msdeploy 创建它,但不删除远程目录的任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8900005/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com