DNX Webjob 无法解析本地项目依赖
DNX Webjob fails to resolve local project dependencies
我们有一个使用 VS2015.1 创建的解决方案,它有 3 个项目,所有项目都是 DNX RC1。
| sln
|+---MVC6 Api
| project.json
| +---ClassLibrary
| Class.cs
| project.json
| \---Webjob
Program.cs
project.json
API 和 Webjob 都在其 project.json 文件中引用了 ClassLibrary。
"frameworks": {
"dnx451": {
"dependencies": {
"ClassLibrary": "1.0.0-*"
}
}
}
我们创建了 2 个 Web 应用程序,它们都与 Continuos Integration 绑定到解决方案存储库,并且每个都有指向 API 文件夹(一个)和 Webjob 文件夹(另一个)的项目应用程序设置。
API 项目部署没有问题,当它尝试解决本地项目依赖时,它起作用了:
Using Project dependency ClassLibrary 1.0.0 for DNX,Version=v4.5.1
Copying source code from Project dependency ClassLibrary
Source D:\home\site\repository\ClassLibrary\project.json
Target D:\local\Tempd32044390806ef\approot\src\ClassLibrary
另一方面,Webjob 失败,它尝试将其解析为 nuget 远程包但失败了:
[01/21/2016 19:47:45 > b597c3: INFO] GET https://api.nuget.org/v3-flatcontainer/ClassLibrary/index.json
[01/21/2016 19:47:46 > b597c3: INFO] NotFound https://api.nuget.org/v3-flatcontainer/ClassLibrary/index.json 507ms
[01/21/2016 19:47:46 > b597c3: ERR ] Unable to locate Dependency ClassLibrary >= 1.0.0-*
这最后一部分我必须通过 Kudu 检查它,因为它显然是在 WebJob 的第一个 运行 上完成的,而不是在部署阶段(与 API 一样)。
运行 WebJob 在本地运行没有问题。
我尝试了 中的解决方案,但没有成功。
在与产品团队讨论后,默认情况下 3 项目方案现在无法使用。
中描述的解决方案适用于 2 个项目的情况,但是如果您需要部署依赖于相同 Class 库项目的 Web 作业和 Web 应用程序,并且 3 个都在相同的 repo,您不能从持续集成中部署 Webjob。
解决方案是为您的 Web 应用程序设置持续集成(它将默认运行)并手动将您的 WebJob 部署为压缩文件。
进入您的 WebJob 文件夹并 运行 dnu publish
。
进入bin/output/approot/src/YourWebJobFolder
.
编辑 自动生成的 CMD 文件.
通过自定义第 4 行使用此脚本:
@ECHO OFF
:: 1. Prepare environment
SET DNX_CONSOLE_APP_PATH=Autocosmos.Trunk.Webjob
SET DNVM_CMD_PATH_FILE="%USERPROFILE%\.dnx\temp-set-envvars.cmd"
:: 2. Install DNX
CALL PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';$CmdPathFile='%DNVM_CMD_PATH_FILE%';& '%SCM_DNVM_PS_PATH%' " install latest
IF ERRORLEVEL 1 GOTO ERROR
:: 3. Put DNX on the path
IF EXIST %DNVM_CMD_PATH_FILE% (
CALL %DNVM_CMD_PATH_FILE%
DEL %DNVM_CMD_PATH_FILE%
)
call :ExecuteCmd dnx --project "%~dp0src\%DNX_CONSOLE_APP_PATH%" --configuration Release %DNX_CONSOLE_APP_PATH% run
goto end
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
然后 ZIP bin/output/approot 并上传 到 Azure。
我们有一个使用 VS2015.1 创建的解决方案,它有 3 个项目,所有项目都是 DNX RC1。
| sln
|+---MVC6 Api
| project.json
| +---ClassLibrary
| Class.cs
| project.json
| \---Webjob
Program.cs
project.json
API 和 Webjob 都在其 project.json 文件中引用了 ClassLibrary。
"frameworks": {
"dnx451": {
"dependencies": {
"ClassLibrary": "1.0.0-*"
}
}
}
我们创建了 2 个 Web 应用程序,它们都与 Continuos Integration 绑定到解决方案存储库,并且每个都有指向 API 文件夹(一个)和 Webjob 文件夹(另一个)的项目应用程序设置。
API 项目部署没有问题,当它尝试解决本地项目依赖时,它起作用了:
Using Project dependency ClassLibrary 1.0.0 for DNX,Version=v4.5.1
Copying source code from Project dependency ClassLibrary
Source D:\home\site\repository\ClassLibrary\project.json
Target D:\local\Tempd32044390806ef\approot\src\ClassLibrary
另一方面,Webjob 失败,它尝试将其解析为 nuget 远程包但失败了:
[01/21/2016 19:47:45 > b597c3: INFO] GET https://api.nuget.org/v3-flatcontainer/ClassLibrary/index.json
[01/21/2016 19:47:46 > b597c3: INFO] NotFound https://api.nuget.org/v3-flatcontainer/ClassLibrary/index.json 507ms
[01/21/2016 19:47:46 > b597c3: ERR ] Unable to locate Dependency ClassLibrary >= 1.0.0-*
这最后一部分我必须通过 Kudu 检查它,因为它显然是在 WebJob 的第一个 运行 上完成的,而不是在部署阶段(与 API 一样)。
运行 WebJob 在本地运行没有问题。
我尝试了
在与产品团队讨论后,默认情况下 3 项目方案现在无法使用。
解决方案是为您的 Web 应用程序设置持续集成(它将默认运行)并手动将您的 WebJob 部署为压缩文件。
进入您的 WebJob 文件夹并 运行 dnu publish
。
进入bin/output/approot/src/YourWebJobFolder
.
编辑 自动生成的 CMD 文件.
通过自定义第 4 行使用此脚本:
@ECHO OFF
:: 1. Prepare environment
SET DNX_CONSOLE_APP_PATH=Autocosmos.Trunk.Webjob
SET DNVM_CMD_PATH_FILE="%USERPROFILE%\.dnx\temp-set-envvars.cmd"
:: 2. Install DNX
CALL PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';$CmdPathFile='%DNVM_CMD_PATH_FILE%';& '%SCM_DNVM_PS_PATH%' " install latest
IF ERRORLEVEL 1 GOTO ERROR
:: 3. Put DNX on the path
IF EXIST %DNVM_CMD_PATH_FILE% (
CALL %DNVM_CMD_PATH_FILE%
DEL %DNVM_CMD_PATH_FILE%
)
call :ExecuteCmd dnx --project "%~dp0src\%DNX_CONSOLE_APP_PATH%" --configuration Release %DNX_CONSOLE_APP_PATH% run
goto end
:ExecuteCmd
setlocal
set _CMD_=%*
call %_CMD_%
if "%ERRORLEVEL%" NEQ "0" echo Failed exitCode=%ERRORLEVEL%, command=%_CMD_%
exit /b %ERRORLEVEL%
:error
endlocal
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul
:exitSetErrorLevel
exit /b 1
:exitFromFunction
()
:end
endlocal
echo Finished successfully.
然后 ZIP bin/output/approot 并上传 到 Azure。