【问题标题】:cspack behaviour differs from msbuildcspack 行为不同于 msbuild
【发布时间】:2013-08-08 04:37:10
【问题描述】:

使用 Visual Studio 2012、Azure SDK 2.1,我试图找出创建 csx 文件夹以在 azure 模拟器中运行的最佳方法。我的理解是,在我打包 Azure 项目之前,不会创建 csx 文件夹。我可以从 Visual Studio 手动创建包,但这不是自动构建的选项。另一个选项是使用 msbuild 命令行创建包。这似乎有点笨拙,因为它实际上会进行比重新打包更耗时的构建。

所以,我认为 cspack 可能是一个更轻量级的选择。但是,当我使用以下命令行调用 cspack 时:

cspack.exe ServiceDefinition.csdef /copyOnly

我收到错误:需要为角色 MyProjWeb 的虚拟路径“Web/”指定物理目录。

但是,我在使用 msbuild 时不会做类似的事情。我已经阅读了很多关于指定物理目录的内容以及它可能导致的一些混乱。因此,除非绝对必要,否则我宁愿不使用它,特别是因为从 msbuild 构建时我不需要指定它。

所以,我的主要问题是 msbuild 做了什么而 cspack 没有做,我如何对 cspack 做同样的事情? 我的另一个问题是,生成 csx 文件夹以在 azure 模拟器中进行测试的最简单方法是什么?

编辑 - 分辨率

我想我会在这里写下我是如何解决这个问题的,以防它帮助别人。我的问题的重要答案(感谢 Chandermani 和其他一些阅读)是带有 /copyOnly 的 CSPack 基本上是根据某些规则对文件夹结构进行的精美 xcopy。如果不使用 /copyOnly ,它还会执行一个精美的 zip 来创建一个包。不要抱怨,它很简单很好,但一开始就知道这一点很好。你可以用它来打包任何东西,因为它不依赖于可以在 Visual Studio 中构建的东西,例如一个 PHP 网站。使用 msbuild 的另一个好处是只复制属于您的网站部署的文件。

所以,当我让 CSPack 工作并指向 mvc 项目文件夹时,我发现它复制了包括源文件在内的所有内容。这不是我想要的。我能找到的解决方案是首先打包网站,然后将 CSPack 指向打包的文件。如果你沿着这条路走,那么this link 非常有价值,因为它一步一步地描述了它。

因此,要么在 Web 项目中使用 msbuild 后步骤来打包文件,然后在我的 Azure 项目中使用后步骤来对其进行 cspack,要么在我的 azure 项目中使用 msbuild 后步骤来创建包(做 cspack 的好处是只包含我的 web 部署文件)。好吧,这似乎更简单,更不容易出错,只需一个后步骤,让 msbuild 完成繁重的工作。因此,我的 azure 项目中的 post 步骤类似于:

"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devfabric:shutdown > NUL
"C:\Program Files\Microsoft SDKs\Windows Azure\Emulator\csrun.exe" /devstore:shutdown > NUL
if $(ConfigurationName) == Debug set CONSTANTSPARAMETER=DEBUG
if $(ConfigurationName) == Release set CONSTANTSPARAMETER=
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe $(ProjectDir)$(ProjectFileName) /t:clean;publish /p:Configuration=$(ConfigurationName) /p:TargetProfile=cloud /p:OutputPath=bin\Cloud$(ConfigurationName) /p:VisualStudioVersion=11.0 /p:overwritereadonlyfiles=true /p:DefineConstants="%CONSTANTSPARAMETER%" /verbosity:minimal /p:PostBuildEvent=

前两行关闭了计算和存储模拟器。

接下来的两行设置预处理器常量。我发现使用 msbuild 行构建时 #if DEBUG 不再生效。我认为这是在创建包时剥离 DEBUG 的安全保护。我只使用由自动构建系统创建的包,所以保持 DEBUG 不变对我来说是安全的。

实际的 msbuild 行有许多开关。我将描述不寻常的:

/p:PostBuildEvent=

如果我们不将 postBuildEvent 设置为空,那么相同的 post 步骤将永远被调用。而且永远...

/p:VisualStudioVersion=11.0

Microsoft 的那些聪明人使使用 Visual Studio 2010 和 2012 打开项目成为可能。这很棒,但是当您从命令行运行 msbuild 并最终得到令人讨厌的 MSB4019 错误消息时会带来极大的悲伤,因为它是在错误的 Visual Studio 文件夹中查找 Azure 工具。

另外,请注意我使用的是云配置文件。因为我只关注 csx 文件,所以此时我使用本地还是云似乎没有什么区别。当我在 azure 中运行时,我指定 ServiceConfiguration.Local.cscfg。

编辑:最后我把它从后期步骤中取出并放入我的自动构建中。我的初衷是从我的开发机器运行测试与我的自动构建相同,但是发布步骤花费了太长时间,并且在调试器下运行时视图来自 obj 文件夹而不是 proj 文件夹,这意味着我即时进行更改时必须复制。

未回答的问题

在涉足该领域时,了解 msbuild 如何减少知识摩擦仍然会很好。它是否为网站创建一个包并将其传递给 CSPack?还是它会解析项目文件,然后将一些疯狂的参数传递给 CSPack?此外,当您在调试器中运行 azure 项目时,它在模拟器中运行,只有 csx 文件夹中的二进制文件(而不是图像等)。它是如何做到的?很高兴看到一些带有 Azure 构建管道图片的描述,其中显示了从部署到部署的整个生命周期。这也可以解释为什么有两个二进制文件副本。此外,如果 Visual Studio 有一个项目标志,例如用于 Azure 项目的 packageOnBuild,并带有执行 copyOnly 或创建包的选项,这将变得容易得多。我认为没有吃完的蛋糕没有意义。 编辑:有一个 DeployOnBuild 设置可以添加到 csproj。

最后,正如我所提到的,这样做的全部目的是获取一个 csx 文件夹,我可以将模拟器指向该文件夹,以便我可以在我的开发机器上运行我的单元测试。我在构建机器上进行正式打包,所以在 Visual Studio 中并不需要它。所以,我真的不想打包任何东西,并希望有一种更简单的方法来实现这一切。

【问题讨论】:

    标签: azure azure-web-roles


    【解决方案1】:

    由于 msbuild 使用 azure 项目文件进行构建,它可以从项目文件中导出大量信息。

    对于 cspack,假设角色代码已编译并可用于打包。由于 cspack 不依赖于项目文件,因此它需要 web\workerrole 项目的代码路径的显式信息。 csdef 文件不包含任何此类信息。我建议如果你想使用 cspack。查看它的documentation 并尝试从命令行创建一个用于模拟器部署的包(CopyOnly 选项)。一旦找到正确的语法,您就可以将其嵌入到您的构建脚本中。

    【讨论】:

    • 谢谢,我已经阅读了该文档。我想知道的是,由于我没有在 Visual Studio 或任何 azure 配置文件中指定物理目录,为什么 msbuild 不需要它但 cspack 需要它?或者,以不同的方式询问 msbuild 从哪里获取这些信息?另外,有没有更简单的方法来生成 csx 文件,因为我真的不想创建一个包,我只想在模拟器中运行?
    • 我不确定它是如何得到的,但是当你创建一个 azure 项目时,你还添加了 web 项目,ccproj 文件包含项目的路径,所以它不会很难要查找路径,请在 .ccproj 文件中提供所有详细信息。用于在模拟器 cspack 中使用 CopyOnly 运行。
    • 谢谢,从 ccproj 获取它是有道理的。根据我的问题中的示例,我已经在使用 CopyOnly。我想我暂时需要这样做。
    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2011-09-17
    • 2014-11-10
    • 2010-09-09
    • 2017-08-28
    相关资源
    最近更新 更多