【问题标题】:SQLite.Interop.dll not getting picked up by OctoPackSQLite.Interop.dll 没有被 OctoPack 拾取
【发布时间】:2015-01-10 18:46:53
【问题描述】:

我有一个使用 TeamCity 构建并由 Octopus Deploy 部署的相对较新的 MVC5 项目。在我通过 NuGet 添加 SQLite 之前,一切都很好。项目建成后,我的 bin 目录下有一个 x86\SQLite.Interop.dll 和一个 x64\SQLite.Interop.dll,它运行良好。

问题是 OctoPack 没有提取任何一个文件;所以,我部署到我的服务器的 NuGet 包没有它。如何解决这个问题?

【问题讨论】:

    标签: asp.net-mvc sqlite teamcity octopus-deploy


    【解决方案1】:

    Octopus Deploy 的优秀人员向我指出了 this help page,这让我大部分时间到达那里。

    对于遇到此特定问题的其他人,我最初将其添加到我的 .nuspec 文件中:

    <files>
        <file src="bin\x86\*.*" target="bin\x86" />
        <file src="bin\x64\*.*" target="bin\x64" />
    </files>
    

    但没有任何东西被复制;所以,我把它改成了这样:

    <files>
        <file src="bin\x86\SQLite.interop.dll" target="bin\x86" />
        <file src="bin\x64\SQLite.interop.dll" target="bin\x64" />
    </files>
    

    然后 TeamCity 出现构建错误,因为 x86 和 x64 为空。看起来 OctoPack 在这些文件被复制之前以某种方式运行。这是一个我希望在某个时候删除的 hack,但我通过将这两个文件添加到我的项目中,并将我的 nuspec 文件更改为这个来让事情正常进行:

    <files>
        <file src="SQLiteFiles\x86\SQLite.interop.dll" target="bin\x86" />
        <file src="SQLiteFiles\x64\SQLite.interop.dll" target="bin\x64" />
    </files>
    

    另外,不要忘记在 TeamCity 中添加 OctoPackEnforceAddingFiles=true。

    【讨论】:

      【解决方案2】:

      我做了类似的事情,但我讨厌将二进制文件签入源代码管理,所以我将它添加到我的 nuspec 文件中:

      <files>
        <file src="..\..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\x86\SQLite.interop.dll" target="x86" />
        <file src="..\..\packages\System.Data.SQLite.Core.1.0.98.1\build\net45\x64\SQLite.interop.dll" target="x64" />
      </files>
      

      只要把它们从包目录中拉出来,我想你可以这样做:

      <files>
        <file src="..\..\packages\System.Data.SQLite.Core.*\build\net45\x86\SQLite.interop.dll" target="x86" />
        <file src="..\..\packages\System.Data.SQLite.Core.*\build\net45\x64\SQLite.interop.dll" target="x64" />
      </files>
      

      而且我认为无论版本如何都可以使用

      【讨论】:

        【解决方案3】:

        您需要添加一个带有 files 元素的 nuspec 文件,以告诉 octopack 它应该包含 SQLite.interop.dll 二进制文件。

        <files>
            <file src="bin\x86\SQLite.interop.dll" target="x86" />
            <file src="bin\x64\SQLite.interop.dll" target="x64" />
        </files>
        

        然后,您需要重新排序项目文件中的导入,以便 SQLite 在 Octopack 之前出现,这将确保 SQLite.interop.dll 在 Octopack 运行之前被复制。

        <Import Project="..\packages\System.Data.SQLite.Core.1.0.105.2\build\net451\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.1.0.105.2\build\net451\System.Data.SQLite.Core.targets')" />
        <Import Project="..\packages\OctoPack.3.0.42\tools\OctoPack.targets" Condition="Exists('..\packages\OctoPack.3.0.42\tools\OctoPack.targets')" />
        

        最后,确保添加参数OctoPackEnforceAddingFiles=true,这告诉 octopack 在 nuspec 文件中包含 Files 元素所针对的文件。

        【讨论】:

          猜你喜欢
          • 2015-07-10
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 2018-05-13
          • 1970-01-01
          相关资源
          最近更新 更多