将文件复制到Azure云服务部署包而不在Web项目中包含或引用它是否有坚实,不费吹灰之力的方法?
我们有一个网站,我们将作为Azure云服务项目和内部部署的Web角色托管,每个网站都需要不同的数据访问层库。我们可以将所有必要的文件转储到项目中并将它们复制到构建中,然后根据环境变量动态选择要加载的程序集,但这看起来有点草率 - 可能有合理的原因我们不希望这些库坐在遥远的Azure区域的服务器上。这些程序集不是由项目直接引用,而是在运行时使用MEF或类似的机制加载。
这是我们尝试过的构建后脚本:
if "$(TargetProfile)" == "" (
echo "OnPrem"
xcopy /Y "$(ProjectDir)\lib\OnPrem\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"
) else (
echo "Cloud"
copy /Y "$(ProjectDir)\lib\Cloud\TestLibrary.dll" "$(ProjectDir)\$(OutputPath)\$(Configuration)"
)
这很有用,因为在构建时以及构建网站项目的msbuild /t:publish
步骤部分期间,文件会按预期复制。但是,TestLibrary.dll文件未包含在云服务包中,未部署,并且无法在运行时加载。
在Azure部署之前是否已完成此类操作?我会承认,我们可能会以错误的方式接近这一点,但我还没有找到符合我们需要的优雅方法。
答案 0 :(得分:2)
在玩了一段时间之后,我想我已经找到了一个或多或少达到我想要的策略。您可以将内容文件添加到与云服务一起打包和部署的CloudService角色,如下所示:
这些文件将添加到.cspkg中的approot中,同样在部署时最终会出现在approot文件夹中。要解决此目录,我这样做了:
string appRoot = Environment.GetEnvironmentVariable("RoleRoot");
appRoot = Path.Combine(appRoot + @"\", @"approot\");
您仍然需要一种方法来复制内部部署的本地.dll,但我们已经有了在现有部署过程中执行此操作的方法。使用CloudConfigurationManager
中的配置设置,您可以告诉应用程序如何解析这些.dll应该驻留的目录,例如:
var libDir = CloudConfigurationManager.GetSetting("Environment").Equals("Cloud")
?
Environment.GetEnvironmentVariable("RoleRoot")
.Path.Combine(appRoot + @"\", @"approot\")
:
HostingEnvironment.MapPath("~\pathToOnPremDlls\")
感觉模糊不清,但似乎运作得很好。