【问题标题】:Changing Clickonce source folder更改 Clickonce 源文件夹
【发布时间】:2010-05-25 15:57:56
【问题描述】:

我们使用构建后事件将我们的生产构建复制到一个单独的文件夹中,并将app.config 文件替换为我们的生产 app.config。但是 Clickonce 会读取 bin\Release 文件夹中的文件。

我还尝试在构建后事件中将所有文件从我们的自定义构建位置复制到 bin\Release 文件夹,但 app.config 仍然被覆盖(我猜 clickonce 将项目重新构建到 bin\Release 中)。

是否可以告诉 Clickonce 从我们的自定义文件夹中读取?或者,如果这不是正确的方法,您如何处理这种情况?

编辑:附加信息

构建后事件脚本:


del /s /q /f "$(SolutionDir)Build\Client"
rmdir /s /q "$(SolutionDir)Build\Client"

if $(ConfigurationName) == Debug goto :debug
if $(ConfigurationName) == Release goto :release

:release

xcopy "$(TargetDir)*.dll" "$(SolutionDir)Build\Client\Prod\" /Y /I /R
xcopy "$(TargetDir)*MyApp.UI.Win.exe" "$(SolutionDir)Build\Client\Prod\" /Y /I /R
copy "$(TargetDir)Configs\App.Production.config" "$(SolutionDir)Build\Client\Prod\$(TargetFileName).config" /Y 

REM for clickonce
copy "$(TargetDir)Configs\App.Production.config" "$(TargetDir)$(TargetFileName).config" /Y
copy "$(TargetDir)Configs\App.Production.config" "$(TargetDir)PostBuildEventWasHere.config" /Y
del /s /q /f "$(TargetDir)\*.pdb"

goto :exit

:debug

xcopy "$(TargetDir)*.dll" "$(SolutionDir)Build\Client\Dev\" /Y /I /R
xcopy "$(TargetDir)*MyApp.UI.Win.exe" "$(SolutionDir)Build\Client\Dev\" /Y /I /R
copy "$(TargetDir)Configs\App.Development.config" "$(SolutionDir)Build\Client\Dev\$(TargetFileName).config" /Y

goto :exit

:exit

还有我的发布输出:


------ Build started: Project: MyApp.UI.Win, Configuration: Release Any CPU ------
(...builds all projects)
Compile complete -- 0 errors, 4 warnings
(...echoing the build event script here, and successful copy/delete messages)
Building MyApp.UI.Win...
(It must be rebuilding here!)
------ Publish started: Project: MyApp.UI.Win, Configuration: Release Any CPU ------
Connecting to '\\MyPublishLocation'...
Publishing files...
Publish success.
\\MyPublishLocation\publish.htm
========== Build: 8 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

【问题讨论】:

    标签: build clickonce


    【解决方案1】:

    我们有一个案例,我们的一个 dll 用于调试和发布配置的许可证不同。我们通过将两个许可证都添加到项目中来处理它,并在构建后命令中将正确的许可证复制到输出。这导致我们的 ClickOnce 部署只是拾取那里的文件。你可以用你的 app.config 文件试试这个,看看它是否有效。我们是这样做的:

    1. 将 app.config 文件之一添加到您的项目中,不管是哪个(因为它将被构建后的副本替换)。这可确保它显示在应用程序文件中并被部署。

    2. 为您要使用的每个配置添加一个文件夹。对于我们来说,我们将这些文件夹称为 license_debug 和 license_release。我们将许可证放在各自的文件夹中。我们最终部署了这两个文件夹,这样文件就可以用于构建后的命令了。

    3. 添加一个构建后命令,该命令基本上将文件从文件夹复制到顶层目录。因此,如果我们进行调试构建,它将复制调试许可证。如果我们进行发布构建,它将复制发布许可证。

    这是我们的构建后命令:

    COPY/Y "$(TargetDir)license_$(ConfigurationName)*.*" "$(TargetDir)"

    我不知道这是否适用于 app.config 文件,但我不知道为什么它不会。

    【讨论】:

    • 感谢您的详细解答。我们在项目中添加了一个 app.config 文件,并在“Configs”文件夹中添加了 3 个其他配置文件。在构建后事件中(在发布模式下),此文件夹中的生产 app.config 文件将按照您的描述复制到顶部文件夹。但是,当我右键单击项目并发布它时,生产 app.config 会被顶部文件夹中的 app.config 覆盖。我猜这是因为 clickonce 在我的构建后事件执行后进行了额外的构建。 Pdb 文件也仍然存在,尽管我在构建后事件中删除了它们。
    • 注意:当我构建项目而不发布时,一切正常。 app.config 正确地替换为我的生产 app.config。发布后将被覆盖。
    • 这很奇怪,我会询问 ClickOnce 团队。以我的经验,它构建然后创建部署。对我们来说,这很好用,但对于 app.config 文件来说可能会有所不同。
    • 如果进入应用程序文件,app.config 文件的属性是什么?是包含吗?如果它出现在解决方案资源管理器中,那么 Build Action 和 Copy-to-output-directory 的属性是什么?
    • 在应用程序文件中,MyWinApp.exe.config 的属性为“Include (Auto)”。对于 app.config 文件;复制到输出目录为“不复制”,构建操作为“无”。
    【解决方案2】:

    我使用 MSBuild 和 mage 解决了这个问题,并使用了下面的示例。我不想使用 MSBuild,但我找不到其他方法。

    http://blog.gatosoft.com/PermaLink,guid,d0a0dd1e-c9ac-4fa9-a408-615454d49702.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多